前言
前文中我们进行了需求澄清,协议制订,服务端设计,本文将在这些的基础上实现完整的服务端功能。
编解码器实现
消息的收发基础是编解码器。上文对协议的制订,最外围的结构是报文头加报文体的形式。针对这个结构,实现报文分割,我们可以直接接触Netty提供的内嵌支持LengthFieldBasedFrameDecoder
进行报文体的长度确定和分割。
报文体中是具体的消息,我们需要根据消息的不同类型来进行具体的区分,这部分就需要自行实现解码器了,自定义解码器的类名制订为handler.CommandDecoder
。解码器的核心思路读取第一个字节的协议类型,而后根据不同的协议类型,按照协议读取出对应的字段数据,将这些字段数据组装Command
对象,并且向后续的处理器进行传递。整体的代码设计如下
public class CommandDecoder extends ChannelInboundHandlerAdapter
{
private static final Charset CHARSET = Charset.forName("utf8");
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
{
Byte