Netty 从LengthFieldBasedFrameDecoder返回的缓冲区太小 我目前正在评估NETY来处理java客户端的socket通信,以便与C++服务器集成。消息传递协议具有以下结构- 带大小的(类型)(子类型)(长度)(消息体) -长度包括标题
遵循Netty api I子类LengthFieldBasedFrameDecoder以接收有效的完整数据包,然后根据接收到的类型对每个数据包进行解码。从我使用的文档中-Netty 从LengthFieldBasedFrameDecoder返回的缓冲区太小 我目前正在评估NETY来处理java客户端的socket通信,以便与C++服务器集成。消息传递协议具有以下结构- 带大小的(类型)(子类型)(长度)(消息体) -长度包括标题,netty,Netty,遵循Netty api I子类LengthFieldBasedFrameDecoder以接收有效的完整数据包,然后根据接收到的类型对每个数据包进行解码。从我使用的文档中- lengthFieldOffset=8 lengthFieldLength=4 长度调整=-12(=HDR1+LEN的长度,负) initialBytesToStrip=0 它可以正常工作大约5分钟(我大约每5秒收到一条消息),然后解码事件包含一个远小于消息大小的ChannelBuffer。(我在坠机前多次收到此消息)。很
- lengthFieldOffset=8
- lengthFieldLength=4
- 长度调整=-12(=HDR1+LEN的长度,负)
- initialBytesToStrip=0
public class CisPacketDecoder extends LengthFieldBasedFrameDecoder
{
public CisPacketDecoder(int maxFrameLength, int lengthFieldOffset,
int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) {
super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment,
initialBytesToStrip);
}
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf)
throws Exception
{
CisMessage message = null;
int type = buf.getInt(0); //Type is always first int
CisMessageType messageType = CisMessageType.fromIntToType(type);
if(messageType != null)
{
message = messageType.getObject();
if(message != null)
{
message.decode(buf.toByteBuffer());
}
else
{
System.out.println("Unable to create message for type " + type);
}
}
//mark the Channel buf as read by moving reader index
buf.readerIndex(buf.capacity());
return message;
}
}
并在这里实例化
public class PmcPipelineFactory implements ChannelPipelineFactory
{
@Override
public ChannelPipeline getPipeline() throws Exception
{
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("encoder", new CisPacketEncoder());
pipeline.addLast("decoder", new CisPacketDecoder(1024, 8, 4, -12, 0));
pipeline.addLast("handler", new MsgClientHandler());
return pipeline;
}
}
您需要调用super.decode(..)并在decode(..)方法中对返回的ChannelBuffer进行操作 就是这样,
public class CisPacketDecoder extends LengthFieldBasedFrameDecoder {
public CisPacketDecoder(int maxFrameLength, int lengthFieldOffset,
int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) {
super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment,
initialBytesToStrip);
}
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf)
throws Exception {
// THIS IS IMPORTANT!!!!!
ChannelBuffer decoded = (ChannelBuffer) super.decode(ctx, channel, buf);
if (decoded == null) {
return null;
}
// NOW ONLY OPERATE ON decoded
CisMessage message = null;
int type = decoded.getInt(0); //Type is always first int
CisMessageType messageType = CisMessageType.fromIntToType(type);
if(messageType != null) {
message = messageType.getObject();
if(message != null) {
message.decode(decoded.toByteBuffer());
} else {
System.out.println("Unable to create message for type " + type);
}
}
return message;
}
}
请务必检查大写注释。非常感谢,现在一切正常。别以为我一个人就能找到那个!