NIO 缓冲区 ByteBuffer 之黏包和半包
2024-10-20 15:46:54
一、低效率方式
/**
* 黏包、半包
*/
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(); // 切换成写模式,为后面消息写入做准备
}
最新文章
- Silverlight ComboBox with TreeView
- [设计模式] javascript 之 迭代子模式
- java中方法的参数传递机制(值传递还是引用传递)
- 【转】C/C++ struct/class/union内存对齐
- Spring MVC 下index.jsp访问
- ASP.NET MVC @helper使用说明
- Arcgis Engine - 鹰眼(减少闪烁)
- 多线程并发编程之显示锁ReentrantLock和读写锁
- cocos2dx的runAction: 反复运行,多个动作连接运行,多个动作同一时候运行的实现
- js字的数目的计算方法(与word计算公式为)
- ubuntu服务器移植步骤
- eclipse安装git插件
- C# 相对路径转绝对路径
- spring aop使用
- 安装ie时,报:此安装不支持您的操作系统的当前语言
- MySQL和MySQL的注释方式
- python matplotlib 库学习
- Unity骨骼动画资源解析与优化
- SQL Server中有关约束(constraint)的一些细节
- C#为什么不能像C/C++一样的支持函数只读传参
热门文章
- windows搭建syncthing中继服务器和发现服务器
- 使用 symfony 框架时 配置运行环境时 报debug 工具栏问题及 No input file specified.
- 八、常用Api
- dayjs取 本周、上周、本月、上月、本季度、上季度时间段
- 最新2019Java调用百度智能云人脸识别流程
- Python项目框架的搭建
- org.aspectj.lang不存在,引入失败。
- 推荐一个json直接导出Excel的网站
- CSP202104-4校门外的树
- mysql(insert + group by + on duplicate key update)