处理粘包和半包
1. 概念
(1)半包:发送的数据包不完整,需要一次或几次接收才能组成完成的一个数据包;
(2)粘包:就是发送了好几个数据包,其中一个数据包不完整。
2.代码
/**
*处理粘包和半包
*/
public class TestByteBufferExam {
public static void main(String[] args) {
ByteBuffer source = ByteBuffer.allocate(32);
source.put("Hello,World\nI'm zhangsan\nHo".getBytes());
split(source);
source.put("w are you?\n".getBytes());
split(source);
}
/**
* 处理粘包和半包的方法
*
* @param source
*/
private static void split(ByteBuffer source) {
// 切换读模式
source.flip();
for (int i = 0; i < source.limit(); i++) {
// 找到一个完整消息
if (source.get(i) == '\n') {
// 从起始点到结束
int length = i + 1 - source.position();
// 把这条完整的信息存入byteBuffer
ByteBuffer target = ByteBuffer.allocate(length);
// 从source读取,向target写入
for (int j = 0; j < length; j++) {
target.put(source.get());
}
// 输出一个完成的包,工具类输出,可以自己输出也行
ByteBufferUtil.debugAll(target);
Charset.defaultCharset().decode(target);
}
}
// 切换写模式
// source.clear(); 从头开始读取
source.compact(); // 从上一个未完成继续读取
}
}