Files
plugin-library/Assets/00.StaryEvo/Runtime/UnitySocket/README.md

71 lines
3.6 KiB
Markdown
Raw Normal View History

2025-07-02 10:05:26 +08:00
# UnitySocket
该项目是基于Unity平台 纯C#编写的Socket网络模块,包括客户端与服务端的实现
## 环境依赖
- 项目运行平台: Unity2022.3.22f1
该项目仅包含网络底层的几个C#脚本与一个测试脚本可以随意选择Unity版本测试。
## 特点
1. 回调事件完善,包含服务器主动踢出、客户端主动断开、心跳包等底层功能逻辑。
2. 对象形式非单例模式一个项目可new多个连接
3. 代码量少纯C#编写未使用插件、DLL及工具类便于二次封装利于移植
## 报文组成
- 通用
报文总长度(4byte) + 报文类型(2byte) + 数据(N byte)
- 心跳包
报文总长度(4byte) + 报文类型-心跳包(2byte)
- 客户端断开
报文总长度(4byte) + 报文类型-客户端断开(2byte)
- 服务端踢出
报文总长度(4byte) + 报文类型-服务端踢出(2byte)
## 工作流
- 建立连接
1. 服务端通过 new SocketServer(string ip,int port) 建立连接
2. 客户端通过 new SocketClient(string ip,int port) 建立实例通过Connect函数尝试连接。
3. 客户端连接成功后,开始定时发送心跳包报文;服务端接收后记录时间,定时检测判断是否超时。
4. 如存在以下情况,则断开连接:
- 服务端主动踢出连接即时响应回调DisConnect
- 客户端主动断开连接即时响应回调DisConnect
- 客户端关闭连接即时响应回调DisConnect
- 服务端检测到客户端太久没有发送心跳包此处需要响应时间根据心跳包超时间隔、心跳包发送间隔及服务端心跳包超时检测间隔来决定发现超时则回调DisConnect
- 通信逻辑过程中报错即时响应自动重连默认重连上限为三次达到重连上限并未成功则回调DisConnect
- 接收数据
1. 接收线程收到数据存放入DataBuff数据缓存区。
2. DataBuff中不断通过SocketDataPack尝试解包解包成功后将报文发送到接收线程。
3. 接收线程收到报文后触发OnReceive回调
4. 业务层通过OnReceive回调接收到报文后反序列化报文体得到数据
- 发送数据
1. 业务层序列化数据得到报文体字节集通过Send函数发送数据。
2. Send函数中通过SocketDataPack装包后以字节集的形式发送出去。
## 代码说明
- DataBufferSocket传输数据缓存区此处主要处理Socket传输时粘包、分包的情况
- SocketEventSocket报文类型枚举此处只枚举了网络底层需要发送的报文类型业务逻辑层所使用的报文类型建议封装至报文体序列化类中
- SocketDataPackSocket报文类处理具体的拆包、装包逻辑
- SocketServerSocket服务端
- SocketClientSocket客户端
## 回调事件
- SocketServer 服务端
- public event Action<Socket> OnConnect; //客户端建立连接回调
- public event Action<Socket> OnDisconnect; // 客户端断开连接回调
- public event Action<Socket, SocketDataPack> OnReceive; // 接收报文回调
- SocketClient 客户端
- public event Action OnConnectSuccess; // 连接成功回调
- public event Action OnConnectError; // 连接失败回调
- public event Action OnDisconnect; // 断开回调
- public event Action<SocketDataPack> OnReceive; // 接收报文回调
- public event Action<SocketException> OnError; // 异常捕获回调
- public event Action<int> OnReConnectSuccess; // 重连成功回调
- public event Action<int> OnReConnectError; // 单次重连失败回调
- public event Action<int> OnReconnecting; // 单次重连中回调