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