1.这里设置字段长度,要减报文头长度和长度值字段的长度所以要减8
byteBuf.setInt(4,byteBuf.readableBytes() - 8 );
下面是改后的源码
public class NettyMessageEncoder extends MessageToByteEncoder<NettyMessage> {
MarshallingEncoder marshallingEncoder;
public NettyMessageEncoder() throws IOException {
this.marshallingEncoder = new MarshallingEncoder();
}
protected void encode(ChannelHandlerContext channelHandlerContext, NettyMessage nettyMessage, ByteBuf byteBuf)
throws Exception {
if (nettyMessage == null || nettyMessage.getHeader() == null) {
throw new Exception("The encode message is null");
}
byteBuf.writeInt(nettyMessage.getHeader().getCrcCode());
byteBuf.writeInt(nettyMessage.getHeader().getLength());
byteBuf.writeLong(nettyMessage.getHeader().getSessionID());
byteBuf.writeByte(nettyMessage.getHeader().getType());
byteBuf.writeByte(nettyMessage.getHeader().getPriority());
byteBuf.writeInt(nettyMessage.getHeader().getAttachment().size());
String key = null;
byte[] keyArray = null;
Object value = null;
for (Map.Entry<String, Object> param : nettyMessage.getHeader().getAttachment().entrySet()) {
key = param.getKey();
keyArray = key.getBytes("UTF-8");
byteBuf.writeInt(keyArray.length);
byteBuf.writeBytes(keyArray);
value = param.getValue();
marshallingEncoder.encode(value, byteBuf);
}
if (nettyMessage.getBody() != null) {
marshallingEncoder.encode(nettyMessage.getBody(), byteBuf);
} else {
byteBuf.writeInt(0);
}
byteBuf.setInt(4,byteBuf.readableBytes() - 8 );
}
}
本文详细介绍了NettyMessageEncoder类的实现,该类继承自MessageToByteEncoder,用于将NettyMessage对象编码为ByteBuf。编码过程包括写入CRC码、长度、会话ID、类型、优先级、附件大小及内容,以及消息体。特别注意,编码完成后会更新长度字段以反映实际的ByteBuf可读字节长度。
315

被折叠的 条评论
为什么被折叠?



