通常情况下,无论在客户端还是在服务端,当我们收到数据后,首先要做的就是把二进制数据转换到Java对象,所以Netty很贴心地提供了一个父类,来专门做这个事情。我们看一下如何使用这个类来实现服务端的解码。
当继承了ByteToMessageDecoder这个类之后,只需要实现decode()方法即可。大家可以看到,这里的in传递进来的时候就已经是ByteBuf类型,所以不再需要强转。第三个参数是List类型,我们通过向这个List里面添加解码后的结果对象,就可以自动实现结果向下一个Handler传递,这样就实现了解码的逻辑Handler。另外,值得注意的是,对于Netty里的ByteBuf,我们使用4.1.6.Final版本,默认情况下用的是堆外内存。而这里我们使用ByteToMessageDecoder,Netty会自动进行内存的释放,我们不用操心太多的内存管理方面的逻辑。通过解码器把二进制数据转换到Java对象即指令数据包之后,就可以针对每一种指令数据包编写逻辑了。
Netty抽象出了一个SimpleChannelInboundHandler对象,自动实现了类型判断和对象传递,
这样我们的应用代码就可以专注于业务逻辑。下面来看如何使用SimpleChannelInboundHandler简化指令处理逻辑。
LoginRequestHandler.java
package com.example.demo.im;
import io.netty.channe