Netty提供了一个特殊的ChannelHandler来专门处理编码逻辑,不需要每一次将响应写到对端的时候都调用一次编码逻辑进行编码,也不需要自行创建ByteBuf。这个类被叫作MessageToByteEncoder,从字面意思可以看出,它的功能就是将对象转换到二进制数据。
使用MessageToByteEncoder来实现编码逻辑的过程如下。
PacketEncoder继承自MessageToByteEncoder,泛型参数Packet表示这个类的作用是实现Packet类型对象到二进制数据的转换。这里我们只需要实现encode()方法。在这个方法里,第二个参数是
Java对象,而第三个参数是ByteBuf对象,我们要做的事情就是,把Java对象的字段写到ByteBuf对象,而不再需要自行去分配ByteBuf对象。
package com.example.demo.im;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import java.util.Objects;
// 魔数(4字节)+版本号(1字节)+序列化算法(1字节)+指令(1字节)+数据长度(4字节)+数据(N字节)
public class PacketCodeC {
public static final int MAGIC = 12345678;
public static final PacketCodeC INSTANCE = new PacketCodeC();
publ