`

分隔符与定长解码器的使用

阅读更多
netty 的分隔符与定长解码器的使用

4种解码器应对TCP的粘包、拆包问题

new ChannelInitializer<SocketChannel>() {
public void initChannel(SocketChannel ch) {
ChannelPipeline pl = ch.pipeline();
//pl.addLast(new LineBasedFrameDecoder(64)); //换行符解码
//pl.addLast(new FixedLengthFrameDecoder(3)); //固定长度解码

//消息以#作为分隔符,当达到单个消息的最大长度仍然没有查到分隔符,抛出TooLongFrameException
// ByteBuf delimiter = Unpooled.copiedBuffer("#".getBytes());
// pl.addLast(new DelimiterBasedFrameDecoder(16, delimiter));
pl.addLast(new SimpleDecoder());
pl.addLast(new SeverHandler());
}

LengthFieldBasedFrameDecoder 有点问题
public class SimpleDecoder extends LengthFieldBasedFrameDecoder {

    private static final int FRAME_MAX_LENGTH = 64;

    public SimpleDecoder() {
        super(FRAME_MAX_LENGTH, 0, 4, 0, 4);
    }

    @Override
    public Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
        ByteBuf frame = null;
        try {
            frame = (ByteBuf) super.decode(ctx, in);
            if (null == frame) {
                return null;
            }

            ByteBuffer byteBuffer = frame.nioBuffer();
            //return RemotingCommand.decode(byteBuffer);
            return decode(byteBuffer);
        } catch (Exception e) {
        e.printStackTrace();
        } finally {
            if (null != frame) {
                frame.release();
            }
        }

        return null;
    }
   /*
    public static RemotingCommand decode(final ByteBuffer byteBuffer) {
        int length = byteBuffer.limit();
        int oriHeaderLen = byteBuffer.getInt();
        int headerLength = getHeaderLength(oriHeaderLen);

        byte[] headerData = new byte[headerLength];
        byteBuffer.get(headerData);

        RemotingCommand cmd = headerDecode(headerData, getProtocolType(oriHeaderLen));

        int bodyLength = length - 4 - headerLength;
        byte[] bodyData = null;
        if (bodyLength > 0) {
            bodyData = new byte[bodyLength];
            byteBuffer.get(bodyData);
        }
        cmd.body = bodyData;

        return cmd;
    }
   
    public static String decode(final ByteBuffer byteBuffer) {
        int length = byteBuffer.limit();
        System.out.println("len="+length);

        byte[] headerData = new byte[length];
        byteBuffer.get(headerData);
        String res=null;
try {
res = new String(headerData, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
        return res;
    }
    */
   
    public static Object decode(final ByteBuffer byteBuffer) {
        int length = byteBuffer.limit();
        int oriHeaderLen = byteBuffer.getInt();
        System.out.println("decode..");
        int headerLength = oriHeaderLen;

        byte[] headerData = new byte[headerLength];
        byteBuffer.get(headerData);
       
        try {
String res = new String(headerData, "utf-8");
return res;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

        //RemotingCommand cmd = headerDecode(headerData, getProtocolType(oriHeaderLen));
        /*
        int bodyLength = length - 4 - headerLength;
        byte[] bodyData = null;
        if (bodyLength > 0) {
            bodyData = new byte[bodyLength];
            byteBuffer.get(bodyData);
        }
        cmd.body = bodyData;
*/
        return null;
    }
}

0
0
分享到:
评论

相关推荐

    netty分隔符和定长解码器的应用

    本篇将深入探讨Netty中的两种解码器:分隔符解码器(DelimiterBasedFrameDecoder)和定长解码器(FixedLengthFrameDecoder)。 首先,我们来看分隔符解码器DelimiterBasedFrameDecoder。在许多网络协议中,消息通常...

    分隔符和定长解码器的应用

    本篇将详细探讨分隔符解码器(DelimiterBasedFrameDecoder)和定长解码器(FixedLengthFrameDecoder)在Netty中的应用,以及它们如何帮助我们高效地处理网络数据。 首先,让我们了解这两个解码器的基本概念: 1. ...

    netty-frameDecoder:换行符,自定义分隔符,定长度解码器

    netty-frameDecoder换行符,自定义分隔符,定长度解码器说明使用tcp传送数据,由于缓存区大小的设置,MSS的tcp分段等因素,数据传输时会出现TCP粘包/拆包的问题。但是底层的tcp无法理解上层的业务数据,所以在底层也...

    netty 开源框架实用知识库分享知识分享

    Netty 提供了多种解码器,例如分隔符解码器和定长解码器。这些解码器可以用来解码数据和处理业务逻辑。 十一、Netty 权威指南之文件传输 Netty 提供了对文件传输的支持,可以用来develop大文件传输应用程序。 ...

    Netty粘包拆包解决方案.docx

    在测试场景中,我们可以通过编写服务端代码故意制造粘包和拆包,然后使用Netty的解码器来验证它们是否能正确处理这种情况。例如,服务端可能会在响应中拼接多个消息,这样接收端就需要依赖解码器来正确地分离出各个...

    Netty权威指南(第2版)(李林峰)-书签目录-完整版.zip

    第5 章 分隔符和定长解码器的应用...... 93 第6 章 编解码技术...... 106 第7 章 MessagePack 编解码...... 118 第8 章 Google Protobuf 编解码...... 128 第9 章 JBoss Marshalling 编...

    03-04-10-Netty编解码的艺术1

    2. 添加分隔符:在每个消息结尾添加特定的分隔符,接收方通过分隔符判断消息边界。 3. 包含消息长度的头部:消息头中包含消息体的长度,便于接收方解析。 4. 自定义应用层协议:设计更为复杂的消息格式来处理边界...

    netty搭建tcp服务,粘拆包解决

    3. **使用FixedLengthFrameDecoder或DelimitersFrameDecoder**:如果消息长度固定或有固定的分隔符,可以使用这两个解码器。FixedLengthFrameDecoder会根据预设的长度来切割数据,而DelimitersFrameDecoder则通过...

    netty-解答1

    解决这个问题通常有两种方式:使用定长报文头或尾部的分隔符(如换行符)。定长报文头可以明确每个数据包的长度,而分隔符则可以通过特定的字符序列来区分不同的消息。这两种方法在实际项目中都有应用,但更常见的是...

    netty拆包粘包解决方案示例

    4. DelimiterBasedFrameDecoder:如果消息之间有特定的分隔符,如换行符(\n)或结束符(\r\n),可以使用此解码器。 5. FixedLengthFrameDecoder:对于固定长度的消息,可以使用这个简单的解码器。 6. ...

    Netty粘包拆包问题解决方案

    在使用 Netty 时,可以根据实际情况选择合适的解码器来解决粘包和拆包问题。 在上面的示例代码中,我们使用了 LengthFieldBasedFrameDecoder 来解决粘包和拆包问题。在服务端,我们使用了 ChannelInitializer 来...

    java8版本base64加密解密的实例

    在Java 8中,Base64工具类被设计成两种形式,一种是编码器和解码器(encoder and decoder),另一种是带有行分隔符的编码器和解码器(encoder and decoder with line separators)。编码器和解码器主要用于处理基本...

    EncoderAndDecode

    - 创建Base64编码器或解码器对象,可以选择不同的模式,例如是否包含行分隔符,是否使用URL安全字符等。 - 对原始二进制数据进行编码,或者对已编码的Base64字符串进行解码。 - 处理编码或解码后的结果,如保存到...

    java内核分析.pdf

    - `file.separator`,`path.separator`和`line.separator`分别返回文件分隔符、路径分隔符和行分隔符。 可以通过`System.getProperties()`获取所有系统属性,或者使用`getProperty()`方法获取特定属性值。如果...

    粘包和拆包及Netty解决方案.docx

    通过设置固定长度,该解码器能确保每次读取的数据都是一个完整的数据包。如果当前读取的数据长度不足,则等待下一个数据包到来后再进行补足。 ```java ch.pipeline().addLast(new FixedLengthFrameDecoder(20)); ...

    SerDes基础知识介绍

    - **特殊字符**: 通过特殊字符的编码,可以将控制信息插入数据流中,如分隔符、校准命令等,而不被解码为普通数据。 ##### 2.2 时钟数据恢复(CDR) **时钟数据恢复(CDR)**是一项重要的技术,它能够从数据流中提取...

    《PythonCook》

    文件与IO章节包含了读写文本数据、打印输出至文件中、使用其他分隔符或行终止符打印、读写字节数据、文件不存在才能写入、字符串的I/O操作、读写压缩文件、固定大小记录的文件迭代、读取二进制数据到可变缓冲区中、...

    Netty面试专题1

    - 使用定长消息 - 使用消息头记录消息长度 - 分隔符分隔不同消息 - Netty提供的FrameDecoder解码器,可以根据特定规则进行拆包。 ### 5. 序列化协议 在Netty中,常见的序列化协议包括: - **Java序列化**:Java...

    MD5/SHA1/BASE64加密程序

    BASE64编码将每个3个字节的数据块转换为4个6位的字节,然后将这些字节表示为64字符集中的一个字符,最后可能需要添加填充符和行分隔符以满足特定格式要求。解密过程则相反,将这些字符转换回原始二进制数据。在软件...

    条码的技术应用.pptx

    分隔符用于区分条码中的不同数据区域。此外,条码的密度表示单位长度或面积内能表达的字符数,通过调整X尺寸可以改变条码的密度。对比度是条和空之间的反射率差异,对于扫描器识别至关重要,一般要求最小对比度为75%...

Global site tag (gtag.js) - Google Analytics