Netty4的可读字节太小
问题描述:
当使用Netty4解码时,我得到异常。该消息的长度只有640,但是这个只读的字节数是不够的。Netty4的可读字节太小
06-19 21:45:13.150 4192-4233/com.seewo.remote V/RemoteMassageDecoder: Decoder messageType == 1, messageLength: 640
06-19 21:45:13.152 4192-4233/com.seewo.remote E/exceptionCaught: io.netty.handler.codec.DecoderException: java.lang.Exception: readableBytes is too small
1,首先,在ChannelInitializer
private static final int MAX_FRAME_LENGTH = 1024 * 1024;
private static final int LENGTH_FIELD_LENGTH = 4;
private static final int LENGTH_FIELD_OFFSET = 1;
private static final int LENGTH_ADJUSTMENT = 2;
private static final int INITIAL_BYTES_TO_STRIP = 0;
channelPipeline.addLast("decoder", new RemoteMassageDecoder(MAX_FRAME_LENGTH,
LENGTH_FIELD_LENGTH, LENGTH_FIELD_OFFSET, LENGTH_ADJUSTMENT, INITIAL_BYTES_TO_STRIP));
channelPipeline.addLast("encoder", new RemoteMessageEncoder());
添加解码器
2,第二,从服务器解码器字节
@Override
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
byte startCharacter = in.readByte();
int messageLength = in.readInt();
byte messageType = in.readByte();
in.readByte();
Log.v("RemoteMassageDecoder", "startCharacter == " + (startCharacter & 0xff));
Log.v("RemoteMassageDecoder", "Decoder messageType == " + messageType + ", messageLength: " + messageLength);
if (messageLength < 0) {
throw new Exception("messageLength < 0");
}
if (messageLength == 0 || messageType == 0) {
in.readByte();
return null;
}
if (in.readableBytes() < messageLength) {
throw new Exception("readableBytes is too small");
}
byte[] content = new byte[messageLength];
in.readBytes(content);
byte stopCharacter = in.readByte();
if (startCharacter != START_CHARACTER || stopCharacter != STOP_CHARACTER) {
return null;
}
return ProtocolPack.parseFrom(AESHelper.decryptContent(content));
}
答
原因这个问题很简单:你不能期望TCP流将始终同时返回足够的数据。
解决方案也很简单:您的ChannelHandler只需扩展ReplyingDecoder即可帮助您正确处理底层蒸汽。
可能重复的[Netty channelRead没有得到完整的消息](https://stackoverflow.com/questions/31327443/netty-channelread-not-getting-full-message) – Ferrybig