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