netframe - woodelf-treetop/rcwiki GitHub Wiki

网络层主框架

以及多线程相关的注意事项

​ 在lua的应用层,我们可以直接使用 Network.lua,它调用了NetworkManager.cs,NetworkManager调用了SocketClient,SocketClient封装了TcpClient。lua层的使用者只需要关心 Network.lua 的接口

​ NetworkManager 是唯一的,它允许对应多个SocketClient。

​ 每个SocketClient维持唯一一个tcp连接。极限情况下可以有多个SocketClient同时存在,但NetworkManager在任何时候只接受处理curSocket发来的消息。

  1. NetworkManager

    • ​ 数据在 eventsQueueDic 中维护,有可能从主线程或子线程中收到 event,但自身只在主线程 Update 中处理 event ;

    • ​ 收到 SocketClient 的关闭消息后,会创建新的 SocketClient ,移除旧的,并终止处理本次Update,以保证不处理来自旧连接的消息;

    • ​ Update 中大部分操作是不加锁的,保证主线程流畅,需注意Update中代码的写法,是保证了线程安全的(只取一次SocketEventsQueue);

    • ​ 仅有 AddEvent 与 主线程ReInitCurSocket(Update中处理)有线程锁,用于保护 eventsQueueDic 和 curSocket ;

    • ​ 关于 Queue 的线程安全测试,记录如下:Queue多线程测试

  2. SocketClient

    • ​ 拥有一个TcpClient,并提供与它配套的读写内存与回调函数;

    • ​ 自己维护生命周期,在关闭的时候加锁mLockForClose,确保自己只关闭一次;

    • ​ 调用 NetworkManager.AddEvent 时,传入自身,让 NetworkManager 知道是谁发的事件

⚠️ **GitHub.com Fallback** ⚠️