NIO 缓冲区 ByteBuffer 之黏包和半包
一、低效率方式
/**
* 黏包、半包
*/
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 缓冲区 ByteBuffer 之黏包和半包的更多相关文章
- Netty - 粘包和半包(上)
在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 定义 TCP 传输中,客户端发送数据,实际是把数据写 ...
- C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)
介于网络上充斥着大量的含糊其辞的Socket初级教程,扰乱着新手的学习方向,我来扼要的教一下新手应该怎么合理的处理Socket这个玩意儿. 一般来说,教你C#下Socket编程的老师,很少会教你如何解 ...
- 关于TCP封包、粘包、半包
关于Tcp封包 很多朋友已经对此作了不少研究,也花费不少心血编写了实现代码和blog文档.当然也充斥着一些各式的评论,自己看了一下,总结一些心得. 首先我们学习一下这些朋友的心得,他们是: http: ...
- socket编程 TCP 粘包和半包 的问题及解决办法
一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...
- TCP的粘包、半包和Netty的处理
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 什么是粘包和半包 在客户端发送数据时,实际是把数据写入到了TCP发送 ...
- 详说tcp粘包和半包
tcp服务端和客户端建立连接后会长时间维持这个连接,用于互相传递数据,tcp是以流的方式传输数据的,就像一个水管里的水一样,从一头不断的流向另一头. 理想情况下,发送的数据包都是独立的, 现实要复杂一 ...
- Netty - 粘包和半包(下)
上一篇介绍了粘包和半包及其通用的解决方案,今天重点来看一下 Netty 是如何实现封装成帧(Framing)方案的. 解码核心流程 之前介绍过三种解码器FixedLengthFrameDecoder. ...
- c# socket 解决粘包,半包
处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断 ...
- TCP的组包、半包、粘包与分包
一.概念 1)组包.简单的说就是tcp协议把过大的数据包分成了几个小的包传输,接收方要把同一组的数据包重新组合成一个完整的数据包. 2)半包.指接受方没有接受到一个完整的包,只接受了部分,这种情况主要 ...
- c# Socket通讯中关于粘包,半包的处理,加分割符
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using S ...
随机推荐
- Centos操作系统在虚拟机VMware上的安装(二)
a:hover { color: rgba(255, 102, 0, 1) } 1.下载centos操作系统,提供百度云盘链接:http://pan.baidu.com/s/1pLHOR03 2.打开 ...
- 修改jar包内容
列举jar包内容 # 列举jar包所有文件 jar tvf test.jar 从jar包中提取文件 # 从test.jar中提取test.jar/test.txt到test.txt jar xvf t ...
- 【Linux】ntpdate与ntpd区别
前两天遇到时间显示的问题,整理记录下来. 问题描述:开机程序startA自己统计自己的运行时间,每次运行时间显示异常,类似17713d45h54m. 有一些猜测:1.计算异常,出现负数:2.获取时间异 ...
- Kubernetes--管理资源标签(标签)
随着同类型资源对象的数量越来越多,分类管理也变得越来越有必要:基于简单且直接的标准将资源对象划分为多个较小的分组,无论是对开发人员还是对系统工程师来说,都能提升管理效率,这也正是 Kubernetes ...
- mac使用expect登录跳板机后的机器
两个文档 #!/usr/bin/expect -f #连接文件名字记录 set ip [lindex $argv 0] catch {spawn ssh 1.1.1.1}## ip地址换成自己的 ex ...
- Python_七十二变_二进制和字符编码
第二章 七十二变 二进制和字符编码 8bit为1byte 字节 1024byte为1KB 千 1024KB为1MB 兆 1024MB为1GB 吉 1024GB为1TB 太 ASCLL字符 ...
- windows下搭建stm8s开发环境
拓扑:windows -> st_link_v2 ->目标板,目标板不由st_link_v2供电 接线: st_link_v2: NRST GND SWIM 3V3 ↓ ↓ ↓ ↓ 目标板 ...
- SpringBoot打成war包,部署到Tomcat服务器
SpringBoot默认达成jar包,使用SpringBoot构想web应用,默认使用内置的Tomcat.但考虑到项目需要集群部署或者进行优化时,就需要打成war包部署到外部的Tomcat服务器中. ...
- 用“餐厅打包”的故事说明白Python里面的自定义函数
注:博主并非Python专业程序员,年龄12岁,Python龄不到1岁,才疏学浅,如有错误还请大佬指教! 希望能通过本专栏帮助到一些Python小白! 嗨~大家好!上篇博文咱们说了,万一有一些上万行才 ...
- webssh
目录 使用 jupyter notebook 使用webssh GateOne 使用 jupyter notebook pip install jupyter ipyton # 启动 jupyter ...