首先我们需要了解三个Socket类里面的方法:
1、Socket.Bind()
2、Socket.Listen()
3、Socket.Accept()
4、Socket.Send()
5、Socket.Receive()
参考连接:Socket 类 (System.Net.Sockets) | Microsoft Learn
在了解完Socket通讯流程图和相关API之后我们来开发服务端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace UnityServer
{
internal class Server
{
public static void Main()
{
//定义socket
Socket serverSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
//绑定ip和端口
IPAddress ip=IPAddress.Parse("127.0.0.1");
IPEndPoint iPEndPoint = new IPEndPoint(ip, 8888);
serverSocket.Bind(iPEndPoint);
//监听
serverSocket.Listen(0);
Console.WriteLine("服务端启动成功");
while (true)
{
Socket clientSocket = serverSocket.Accept();
Console.WriteLine("服务端Accept");
//Receive
byte[] readBuffer=new byte[1024];
int count = clientSocket.Receive(readBuffer);
string readStr = Encoding.UTF8.GetString(readBuffer, 0, count);
Console.WriteLine("接收到的消息"+readStr);
string sendStr = "我是服务端";
byte[] sendBuffer = Encoding.UTF8.GetBytes(sendStr);
clientSocket.Send(sendBuffer);
}
}
}
}
注意我们的服务端是需要两个Socket,而客户端只需要一个,这里面Listen的参数是挂起队列的长度,0表示不受限制,死循环是为了让服务端可以一直接收客户端发来消息。
我们这里虽然写完了服务端代码,但是我们用的是阻塞方法,举个例子如果Unity发送一条信息,我们的服务端会正常接收,但是如果我们发送第二条数据的时候,Unity会卡死,这是因为我们在服务端的死循环里面是先Accept(阻塞方法),也就是服务端会一直等待客户端的连接知道客户端连接进来才会往后面走,但是我们这里面没有第二个服务端连接进来,所以程序会卡死,而服务端卡死导致客户端Receive(接收消息)失败,所以Unity也卡死。
了解了这些,我们下一节来开发异步Socket来避免阻塞