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 );
}
}