- 调用flip方法将接收数据的缓冲区切换至读模式。
- 执行进行数据解析。若无法解析出一个完整的消息则返回null,结束本次解析操作;若在解析过程中出现异常会触发状态机PROCESS_EXCEPTION,在这个环节出现异常通常是因为接收到了非法数据,此类问题的常见处理方式为关闭当前网络。
- 如果成功解析出一个业务消息,会执行消息处理器
messageProcessor.process(this, dataEntry)
。这个阶段出现的运行时异常并不影响原网络传输中的数据有效性,所以smart-socket对异常进行了捕获并依旧以状态机PROCESS_EXCEPTION的形式反馈给用户。 - 完成业务处理后若缓冲区中还存留未解析的数据,会再次执行解码(步骤2)、业务处理(步骤3)操作。
- byteBuf中存放了业务处理后待发送的数据,执行flush进行数据输出。
- 监测当前AioSession状态,如若已不可用则结束。
- 若AioSession依旧处于可用状态,则切换缓冲区至写状态,并触发读操作
continueRead
。
- 识别writeBuffer或缓冲集合bufList中是否存在待输出的数据,若有则继续执行写操作
continueWrite()
。 - 如果数据已经输出完毕,则释放信号量。
- 由于并发的因素可能在释放信号量之后又有数据被写进来,且会话依旧处于可用状态,则当前线程会去竞争信号量资源,并在成功获取到信号量后执行数据输出。
void writeToChannel() {
if (writeBuffer == null) {
writeBuffer = byteBuf.bufList.poll();
writeBuffer.clean();
writeBuffer = byteBuf.bufList.poll();
}
if (writeBuffer != null) {
return;
}
//此时可能是Closing或Closed状态
if (status != SESSION_STATUS_ENABLED) {
close();
} else if (!byteBuf.isClosed()) {
//也许此时有新的消息通过write方法添加到writeCacheQueue中
byteBuf.flush();
上一篇:2.5 小结
下一篇:2.1 核心接口与状态机