t-io 消息处理流程
t-io
是一个高效的 Java 网络通信框架,它通过 Packet
、ChannelContext
、AioHandler
和 AioListener
等核心组件,处理 TCP 连接的数据收发和业务逻辑。以下是关于这些组件的详细介绍以及消息处理的过程。
1. Packet
Packet
是用于表示业务数据结构的类。在使用 t-io
时,通常会通过继承 Packet
类来实现自己的业务数据结构。你可以把 Packet
看作一个普通的 VO(Value Object)对象,用于传递数据。
注意:建议不要直接使用
Packet
对象,而是继承Packet
类来定义自己的数据结构。
2. ChannelContext
每当一个 TCP 连接建立时,t-io
框架会为该连接分配一个 ChannelContext
对象。ChannelContext
是该连接的上下文对象,保存了连接的各种状态信息,并在整个连接的生命周期内被用于处理和管理该连接的所有操作。
3. AioHandler
AioHandler
是处理消息的核心接口。当你使用 t-io
作为 TCP 客户端时,需要实现 ClientAioHandler
;当你使用 t-io
作为 TCP 服务器时,需要实现 ServerAioHandler
。AioHandler
接口定义了三个重要的方法:
decode
: 将ByteBuffer
解码为业务需要的Packet
对象。如果收到的数据不完整导致解码失败,可以返回null
,框架会自动将后续收到的数据与之前的数据进行拼接。encode
: 将业务Packet
对象编码为ByteBuffer
,以便发送到客户端或服务器。handler
: 处理接收到的Packet
对象,执行业务逻辑。
以下是 AioHandler
的接口定义示例:
package com.litongjava.tio.core.intf;
import java.nio.ByteBuffer;
import com.litongjava.tio.core.ChannelContext;
import com.litongjava.tio.core.TioConfig;
import com.litongjava.tio.core.exception.TioDecodeException;
public interface AioHandler {
Packet decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext) throws TioDecodeException;
ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext);
void handler(Packet packet, ChannelContext channelContext) throws Exception;
}
4. AioListener
AioListener
是监听消息处理的核心接口。当你使用 t-io
作为 TCP 客户端时,需要实现 ClientAioListener
;当你使用 t-io
作为 TCP 服务器时,需要实现 ServerAioListener
。它定义了处理连接和消息生命周期的各个回调方法,如连接建立、消息解码、消息发送、消息处理等。
以下是 AioListener
的接口定义示例:
package com.litongjava.tio.core.intf;
import com.litongjava.tio.core.ChannelContext;
public interface AioListener {
void onAfterConnected(ChannelContext channelContext, boolean isConnected, boolean isReconnect) throws Exception;
void onAfterDecoded(ChannelContext channelContext, Packet packet, int packetSize) throws Exception;
void onAfterReceivedBytes(ChannelContext channelContext, int receivedBytes) throws Exception;
void onAfterSent(ChannelContext channelContext, Packet packet, boolean isSentSuccess) throws Exception;
void onAfterHandled(ChannelContext channelContext, Packet packet, long cost) throws Exception;
void onBeforeClose(ChannelContext channelContext, Throwable throwable, String remark, boolean isRemove) throws Exception;
}
5. 消息处理过程
每当一个 TCP 连接建立时,t-io
会为该连接分配一个 ChannelContext
对象。这个对象贯穿整个连接的生命周期,并在以下过程中被多次使用。
发送端消息处理过程
- 创建
Packet
对象: 构建一个要发送的Packet
数据包,包含业务数据。 - 编码: 使用
AioHandler.encode(Packet, GroupContext, ChannelContext)
方法将Packet
编码为ByteBuffer
,以便通过网络传输。 - 发送数据: 使用
Tio.send()
方法,将编码后的ByteBuffer
通过 TCP 连接发送到接收端。
接收端消息处理过程
- 接收数据: 从 TCP 连接中接收到一个
ByteBuffer
,包含了发送端传递的数据。 - 解码: 使用
AioHandler.decode(ByteBuffer, int, int, int, ChannelContext)
方法,将ByteBuffer
解码为Packet
对象。 - 处理数据: 使用
AioHandler.handler(Packet, ChannelContext)
方法,处理解码后的Packet
对象,执行相应的业务逻辑。
详细过程说明
发送端和接收端的消息处理过程如图所示:
- 在发送端,创建
Packet
后,通过AioHandler.encode()
方法将其编码为ByteBuffer
,然后使用Tio.send()
方法发送给接收端。 - 在接收端,通过
AioHandler.decode()
方法将接收到的ByteBuffer
解码为Packet
,再通过AioHandler.handler()
方法进行业务逻辑处理。
总结
t-io
的消息处理过程依赖于 Packet
来封装业务数据,通过 ChannelContext
维护连接状态,使用 AioHandler
处理消息的编码、解码和业务逻辑,最终通过 AioListener
监听连接和消息的生命周期事件。整个流程简洁高效,适用于高性能的网络通信场景。