IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> ByteBuffer 之黏包和半包 -> 正文阅读

[Java知识库]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) {
        /*
        网络上传输多条数据给服务器,数据之间使用 \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
        */
        // 模拟处理粘包、半包现象
        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(); // 切换成写模式,为后面消息写入做准备
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:26:14  更:2022-05-09 12:27:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:01:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码