netty 数据包分包解码问题

有谁精通netty ,数据包解码是,不确定数据包大小,怎么能收到完整的数据包?

5个回答

我有个程序的包结构是这样的:1byte(包类型)+4byte(包体长度)+实际包体,于是写了下面的代码:
[code="java"]
public class ReceivingPacketHandler extends FrameDecoder {
public static fianl int HEADER_SIZE=5;

@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
        ChannelBuffer buf) throws Exception {
    if (buf.readableBytes() < HEADER_SIZE) {
        // The header length field was not received yet - return null.
        return null;
    }
    buf.markReaderIndex();
    // Read protocol header
    buf.readByte();
    // Read the data length field.
    int length = buf.readInt();
    buf.resetReaderIndex();
    // Make sure if there's enough bytes in the buffer.
    int totalLength = length + HEADER_SIZE;
    if (buf.readableBytes() < totalLength) {
                //the whole packet was not received yet - return null.
        return null;
    }
    Packet recievedPacket = new Packet(size >= 0 ? size : bufSize);
    recievedPacket.clear();
    recievedPacket.readPacket(buf, totalLength);
    return recievedPacket;
}

}
[/code]

qiemengdao
qiemengdao Packet是我对包读写的一个封装类,这个你可以自己实现
接近 7 年之前 回复

这个和是否是netty没有关系,基于TCP的通信必须要有一定的规范,通常会在包头定义包的长度,你可以根据长度readFully读出整个包

brandom520
brandom520 好的,谢谢!也是用的netty吗?
接近 7 年之前 回复
qiemengdao
qiemengdao 一般情况会固定包头的长度,包头里面包含长度信息,我有一段代码在公司,明天给你
接近 7 年之前 回复
brandom520
brandom520 decoder的方法接受的参数是channelbuffer, 这个貌似没这个
接近 7 年之前 回复
brandom520
brandom520 netty怎么读取这个长度, 能提供下代码吗?
接近 7 年之前 回复

这个跟是不是用netty没有关系,牵涉到网络通信的地方都需要进行协议的制定。一般来说有如下几个点:

1、结构定义:magicNumber+packageLength+自定义字段+消息内容+校验码
2、粘包处理:解包的时候,先查找magicNum的位置,然后开始读取包长度,解析出有用的消息内容。如果接受的数据不足以刚好解出完整个数的数据包,把剩余的数据放到缓存,等下次接受数据之后拼接起来继续解包。

把上面两个做好就可以了。

不确定包体的大小,可以采用header-content的方式,在header中标示真实包体的长度,类似http1.0协议中的content-length。具体可以参照netty中的objectencoder,首先长度位用4个字节占位待所有的内容写完再讲真实的长度写会长度占位

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问