一、低效率方式

/**
* 黏包、半包
*/
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(); // 切换成写模式,为后面消息写入做准备
}

最新文章

  1. Silverlight ComboBox with TreeView
  2. [设计模式] javascript 之 迭代子模式
  3. java中方法的参数传递机制(值传递还是引用传递)
  4. 【转】C/C++ struct/class/union内存对齐
  5. Spring MVC 下index.jsp访问
  6. ASP.NET MVC @helper使用说明
  7. Arcgis Engine - 鹰眼(减少闪烁)
  8. 多线程并发编程之显示锁ReentrantLock和读写锁
  9. cocos2dx的runAction: 反复运行,多个动作连接运行,多个动作同一时候运行的实现
  10. js字的数目的计算方法(与word计算公式为)
  11. ubuntu服务器移植步骤
  12. eclipse安装git插件
  13. C# 相对路径转绝对路径
  14. spring aop使用
  15. 安装ie时,报:此安装不支持您的操作系统的当前语言
  16. MySQL和MySQL的注释方式
  17. python matplotlib 库学习
  18. Unity骨骼动画资源解析与优化
  19. SQL Server中有关约束(constraint)的一些细节
  20. C#为什么不能像C/C++一样的支持函数只读传参

热门文章

  1. windows搭建syncthing中继服务器和发现服务器
  2. 使用 symfony 框架时 配置运行环境时 报debug 工具栏问题及 No input file specified.
  3. 八、常用Api
  4. dayjs取 本周、上周、本月、上月、本季度、上季度时间段
  5. 最新2019Java调用百度智能云人脸识别流程
  6. Python项目框架的搭建
  7. org.aspectj.lang不存在,引入失败。
  8. 推荐一个json直接导出Excel的网站
  9. CSP202104-4校门外的树
  10. mysql(insert + group by + on duplicate key update)