ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NIO 缓冲区 ByteBuffer 之黏包和半包

2021-07-12 23:34:06  阅读:216  来源: 互联网

标签:NIO 黏包 System len ByteBuffer println 半包 out buff


 

/**
 * 黏包、半包
 */
private static void buffExample2() {
    /*
    网络上传输多条数据给服务器,数据之间使用 \n 分隔。
    但由于某种原因(多条数据合并发送会快)这些数据在接收时,被进行了重新组合,例如3条原始数据:
        Hello world!\n
        I'm Lihua.\n
        How are you?\n
     变成了2个 ByteBuffer,一个叫黏包,一个叫半包:
        Hello world!\nI'm Lihua.\nHow a
        re you?\n

     如何使用代码将错乱的数据恢复成原来使用 \n 分割的样子
     */
    // 模拟处理黏包、半包现象
    ByteBuffer buf1 = ByteBuffer.allocate(50); // 接受到网络传输第一条消息
    buf1.put("Hello world!\nI'm Lihua.\nHow a".getBytes(StandardCharsets.UTF_8));
    System.out.println("第一次调用:");
    msgSplit(buf1); // 调用处理方法
    buf1.put("re you?\n".getBytes(StandardCharsets.UTF_8)); // 接受到网络传输第二条消息
    System.out.println("第二次调用:");
    msgSplit(buf1); // 调用处理方法

}

private static void msgSplit(ByteBuffer buff) {
    buff.flip(); // 切换成读模式,为下面的读取字符做准备
    for (int i = 0; i < buff.limit(); i++) {
        if (buff.get(i) == '\n') { // 判断 \n 所在位置
            // 计算将要截取字符串的长度,包含 \n 符号在内
            int len = i + 1 - buff.position(); // buff.position() 指针的位置
            System.out.println("position:" + buff.position() + ",limit:" + buff.limit() + ",len:" + len);
            ByteBuffer readBuff = ByteBuffer.allocate(len);
            for (int j = 0; j < len; j++) {
                readBuff.put(buff.get());
            }
            readBuff.flip();
            System.out.println("读取到的消息:" + StandardCharsets.UTF_8.decode(readBuff));
        }
    }
    System.out.println("切换成写模式!");
    buff.compact(); // 切换成写模式,为后面消息写入做准备
}

 

标签:NIO,黏包,System,len,ByteBuffer,println,半包,out,buff
来源: https://www.cnblogs.com/zhousjcn/p/15004503.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有