栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ByteBuffer 之黏包和半包

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ByteBuffer 之黏包和半包

应用层的拆包和粘包 - 知乎简介拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的 粘包。而如果通讯的一端发送的数…https://zhuanlan.zhihu.com/p/77275039 

拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。而如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个最大tcp长度的tcp报文分开传输,这就叫做拆包。

package org.example;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

public class TestByteBufferExam {

    
    public static void main(String[] args) {
        
        // 模拟处理粘包、半包现象
        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(); // 切换成写模式,为后面消息写入做准备
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868121.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号