-
AChannel
AChannel类继承自ComponentWithId。内部保存了一些和网络传输相关的字段(AService,IPEndPoint等),还有两个委托Action<AChannel, int> errorCallback和Action<MemoryStream> readCallback。这两个委托和消息传输的结果相关,分别用于保存错误消息和正确消息的执行方法。在正确传输后,会执行OnRead方法,传输失败是执行OnError方法。
Achannel类的构造函数是用protected修饰的,在初始化的时候会生成组件的唯一Id(IdGenerater.GenerateId()方法),服务器类型和ChannelType。
另外,还有两个抽象方法,Start方法和Send方法。
-
Session类
Module.Session类是继承自Entity, 有一个Awake事件,在组件初始化过程中会执行Awake方法。该方法会确定一个AChannel对象,同时清空Dictionary<int, Action<IResponse>> requestCallback字典(该字典猜测是用于存放相应后端消息的方法)。最后会给AChannel的两个委托添加元素。
Run(MemoryStream memoryStream)方法(关于MemoryStream类可以看这篇文章),参数就是网络消息流的内容(具体是否包括参数内部,还不知道)。通过对流内容的判断,获取其消息码的区间范围,判断是否属于ClientHotfixMessage消息,如果是,则调用SessionCallbackComponent组件执行,这里是将消息转发到了Hotfix层去执行了。否则,就通过OpcodeTypeComponent组件,获取持有消息码的辅助类,然后配合消息流,反序列化出消息内容。接着对消息做处理,如果是rpc返回消息,否则交由MessageDispatcherComponent组件分发。如果是相应类型的消息,在requestCallback字典中查找相应的消息码,移除对于元素后,执行消息。
Call重载方法,向requestCallback字典中添加元素,Key是一个自增的变量,Value是一个委托,会检测消息的RPC是否异常,然后传递出消息。同时调用Send方法,发送消息。具体用法,还有待学习。
Send(byte flag, ushort opcode, object message)方法,将流指针定位到消息内容起点,将消息内容写入到流中,将流内容包装后,重新发送。至于都包装了哪些内容,暂时不得而知。