Socket通信基本流程
- 首先要启动服务器创建Socket,然后要绑定服务器的一个端口
- 这样客户端通过服务器IP+端口号就能连接到服务器了
- 服务器接下来会设置监听队列,监听并等待要连接到它的客户端
- 客户端在服务器启动之后也建立自己的Socket,然后使用客户端的Socket去连接服务器
- 连接成功之后客户端和服务器之间就可以发送数据和接收数据
- 当客户端关闭的时候,服务器会捕捉到客户端连接关闭
- 服务器会把对应客户端的Socket也进行关闭
实现
新建一个Unity项目新建脚本编写客户端
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;
public class Client : MonoBehaviour
{
private Socket socket;
//定义用来存消息的容器
private byte[] buffer = new byte[1024];
// Start is called before the first frame update
void Start()
{
//参数: IPV4协议, 套接字的传输类型(流式传输), socket传输协议(TCP)
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream ,ProtocolType.Tcp);
//连接服务器: 服务器IP, 服务器端口号
socket.Connect("127.0.0.1", 6666); //连接完成
//连接成功调用接收方法异步接收消息
StartReceive();
//连接成功发送消息
Send();
}
//接收消息
void StartReceive()
{
socket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,ReceiveCallback,null);
}
//接收消息的回调方法(作为参数传递的函数)
void ReceiveCallback(IAsyncResult iar)
{
//接收返回消息长度
int len = socket.EndReceive(iar);
//接收为0代表终止连接
if (len == 0)
{
return;
}
//解析buffer
string str = Encoding.UTF8.GetString(buffer, 0, len);
Debug.Log(str);
//解析完在执行接收方法
StartReceive();
}
void Send()
{
socket.Send(Encoding.UTF8.GetBytes("服务器你好,我是客户端!"));
}
// Update is called once per frame
void Update()
{
}
}
创建一个空物体挂载客户端脚本
新建一个窗体应用编写服务端
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;
public class Program
{
private static Socket socket;
private static byte[] buffer = new byte[1024];
static void Main(string[] args)
{
//初始化
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定
socket.Bind(new IPEndPoint(IPAddress.Any, 6666));
//监听: 挂起的连接队列最大长度 —— 同时处理连接请求的最大数,超出最大数会排队等待
socket.Listen(0);
StartAccept();
Console.Read(); //阻塞住让程序不会结束
}
//开始应答
static void StartAccept()
{
//开始异步应答连接 参数: 回调函数,object
socket.BeginAccept(AcceptCallback, null);
}
static void AcceptCallback(IAsyncResult iar)
{
//异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信。
Socket client = socket.EndAccept(iar);
//开始接收
StartReceive(client);
//重新开始应答
StartAccept();
}
//接收消息
static void StartReceive(Socket client)
{
//开始从连接的 Socket 中异步接收数据
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, client);
}
//回调函数
static void ReceiveCallback(IAsyncResult iar)
{
Socket client = iar.AsyncState as Socket;
//结束接收返回消息长度
int len = client.EndReceive(iar);
//接收为0代表终止连接
if (len == 0)
{
return;
}
//解析buffer
string str = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine(str);
//解析完在执行接收方法
StartReceive(client);
}
}
先运行服务端然后运行客户端