【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程

我这里新建了一个C#控制台项目来写服务端代码。
下面是基于C# Socket的最基础服务端通信流程:

  1. 创建服务端Socket对象
  2. 绑定IP地址和端口
  3. 设置最大监听客户端数量
  4. 等待客户端连接
  5. 收发消息
  6. 释放连接

基于上面流程就能实现一个最简单并且能和客户端通信的服务器程序,每个步骤Socket都提供了相对应的方法,使用Socket提供的方法就行。

创建服务端Socket对象

使用socket需要引用命名空间 using System.Net.Sockets;

//创建服务端socket
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

直接new一个Socket就可以,参数分别是:
1.IP地址类型。AddressFamily.InterNetwork是IPv4类地址,AddressFamily.InterNetworkV6是IPv6类地址,这里用的是IPv4地址。
2.socket类型。TCP协议对应的Socket类型是流类型,所以这个参数用的是SocketType.Stream。
3.协议类型。选择TCP协议。

绑定IP地址和端口

使用socket提供的Bind方法绑定IP地址和端口
在这里插入图片描述
这里需要传入一个EndPoint类型的参数,我们先定义一个IPEndPoint对象(IPEndPoint是继承了EndPoint对象的,可以作为Bind方法的参数),需要引用命名空间using System.Net;
直接new一个IPEndPoint对象,传入IP地址和端口号,IPAddress.Parse(“127.0.0.1”)可以将IP地址字符串转化成IPAddress,使用起来比较方便,端口号自定义需大于1024且没被使用过的端口号。
将iPEndPoint传入Bind方法中即可绑定IP地址和端口号。
127.0.0.1 (保留地址,用于测试)这个IP地址是代表本机的IP地址,由于便于测试,服务端和客户端的程序都在同一台计算机上,所以可以用这个地址。也可以填入你计算机的IP地址,具体本机IP地址怎么查询可以百度一下。

//绑定IP地址和端口
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
serverSocket.Bind(iPEndPoint);

设置最大监听客户端数量

使用socket提供的Listen方法,设置最大监听客户端数量,参数传入一个Int值。
这里我设置了最多监听1024个客户端。

//设置最大监听客户端数量
serverSocket.Listen(1024);

等待客户端连接

使用socket提供的Accept方法,等待客户端连入,这个方法是一个阻塞方法,会阻塞线程,当有客户端连入后才会继续执行该方法下面的逻辑,客户端连入成功后,返回一个与客户端通信的socket,返回的socket后面用于与客户端相互通信。

//等待客户端链接
Socket clientSocket = serverSocket.Accept();

收发消息

使用Send方法发送消息,Receive方法接收消息。
发送消息:
Send需要传入字节数组,这里我们给客户端发送一条string类型的消息,用Encoding.UTF8.GetBytes(需要引用命名空间using System.Text;)将字符串转化成字节数组并传入Send方法中,即可发送消息。
接收消息:
需要定义一个字节数组来存放收到的消息,容量可以定义得稍微大一些。将字节数组传入Receive方法中,当收到消息后,客户端发来的消息会存入这个字节数组,并返回消息的长度,所以Receive会返回一个int值,该值就是消息长度,用于解析消息。
解析消息:
使用Encoding.UTF8.GetString(msgBytes, 0, msgLength)解析字符串消息。这里第一个参数是传入收到消息的字节数组,第二个参数是解析的起始位置,第三个参数是解析消息的长度。

 //给客户端发送消息
clientSocket.Send(Encoding.UTF8.GetBytes("欢迎连入服务端..."));
//接受客户端发来的消息
byte[] msgBytes = new byte[1024];
int msgLength = clientSocket.Receive(msgBytes);
//解析客户端发来的消息
Console.WriteLine("客户端{0}:{1}", clientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(msgBytes, 0, msgLength));

释放连接

使用socket提供的Shutdown函数关闭发送/接收,然后Close关闭就可以释放连接了。
Shutdown传入的参数可以是以下3种,Both是接收/发送都关闭,Receive是关闭接收,Send是关闭发送。
在这里插入图片描述

//通信完成释放连接
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();

以上最简单的服务端代码就完成了,完整代码如下:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace TCPServer
{
    
    
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //创建服务端socket
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定IP地址和端口
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
            serverSocket.Bind(iPEndPoint);
            Console.WriteLine("IP地址和端口号绑定成功...");
            //设置监听客户端数量
            serverSocket.Listen(1024);
            //等待客户端链接
            Console.WriteLine("等待客户端连接...");
            //阻塞主线程,有客户端连入才会往下执行,否则一直在等待
            Socket clientSocket = serverSocket.Accept();
            //给客户端发送消息
            clientSocket.Send(Encoding.UTF8.GetBytes("欢迎连入服务端..."));
            //接受客户端发来的消息
            byte[] msgBytes = new byte[1024];
            int msgLength = clientSocket.Receive(msgBytes);
            //解析客户端发来的消息
            Console.WriteLine("客户端{0}:{1}", clientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(msgBytes, 0, msgLength));
            //通信完成释放连接
            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();

            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
    }
}

收发消息效果需要配合客户端代码才能看出,可以看我的这篇文章《【Unity】Socket网络通信(TCP) - 最基础的客户端通信流程》了解最基础的客户端与服务端通信代码。
以上就是这篇文章的所有内容了,此为个人学习记录,如有哪个地方写的有误,劳烦大佬指出,感谢,希望对各位看官有所帮助!

猜你喜欢

转载自blog.csdn.net/weixin_43453797/article/details/127055485