当前位置: 首页 > news >正文

Java 开发 - 粘包处理器 - 基于分隔符实现

一、具体实现

  • DelimiterPacketHandler.java
public class DelimiterPacketHandler {private StringBuilder buffer = new StringBuilder();private final String delimiter;public DelimiterPacketHandler(String delimiter) {this.delimiter = delimiter;}public List<String> handleData(String data) {buffer.append(data);String str = buffer.toString();int delimiterIndex;List<String> list = new ArrayList<>();while ((delimiterIndex = str.indexOf(delimiter)) != -1) {// 提取完整消息String message = str.substring(0, delimiterIndex);list.add(message);// 移除已处理的消息和分隔符str = str.substring(delimiterIndex + delimiter.length());buffer = new StringBuilder(str);}return list;}public void clear() {buffer = new StringBuilder();}public String peek() {return buffer.toString();}
}

二、测试用例

  1. 正常单条消息
String data = "Hello World#END#";DelimiterPacketHandler delimiterPacketHandler = new DelimiterPacketHandler("#END#");List<String> result = delimiterPacketHandler.handleData(data);System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + delimiterPacketHandler.peek());
# 输出结果输入: Hello World#END#
输出: [Hello World]
缓冲区: 
  1. 粘包,两条消息粘在一起
String data = "消息1#END#消息2#END#";DelimiterPacketHandler delimiterPacketHandler = new DelimiterPacketHandler("#END#");List<String> result = delimiterPacketHandler.handleData(data);System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + delimiterPacketHandler.peek());
# 输出结果输入: 消息1#END#消息2#END#
输出: [消息1, 消息2]
缓冲区: 
  1. 粘包,三条消息粘在一起
String data = "用户登录#END#订单创建#END#心跳检测#END#";DelimiterPacketHandler delimiterPacketHandler = new DelimiterPacketHandler("#END#");List<String> result = delimiterPacketHandler.handleData(data);System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + delimiterPacketHandler.peek());
# 输出结果输入: 用户登录#END#订单创建#END#心跳检测#END#
输出: [用户登录, 订单创建, 心跳检测]
缓冲区: 
  1. 半包,消息被分割
String data_part1 = "这是一条未完";
String data_part2 = "整的消息#END#";DelimiterPacketHandler delimiterPacketHandler = new DelimiterPacketHandler("#END#");List<String> result = delimiterPacketHandler.handleData(data_part1);System.out.println("输入: " + data_part1);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + delimiterPacketHandler.peek());result = delimiterPacketHandler.handleData(data_part2);System.out.println("输入: " + data_part2);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + delimiterPacketHandler.peek());
# 输出结果输入: 这是一条未完
输出: []
缓冲区: 这是一条未完
输入: 整的消息#END#
输出: [这是一条未完整的消息]
缓冲区: 
  1. 混合情况,粘包 + 半包
String data = "完整消息1#END#完整消息2#END#半包消息";DelimiterPacketHandler delimiterPacketHandler = new DelimiterPacketHandler("#END#");List<String> result = delimiterPacketHandler.handleData(data);System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + delimiterPacketHandler.peek());
# 输出结果输入: 完整消息1#END#完整消息2#END#半包消息
输出: [完整消息1, 完整消息2]
缓冲区: 半包消息
http://www.dtcms.com/a/597366.html

相关文章:

  • 高阅读量CSDN文章分析
  • Linux基本命令与工具(一)
  • 类似12306网站开发行唐县网站建设
  • 基于Django实现的智慧校园考试系统-自动组卷算法实现
  • Java垃圾收集器全解:从Serial到G1的进化之旅
  • 如何免费建造网站苏州有哪些做网站公司
  • 基于IMM交互式多模型卡尔曼滤波的目标位置和速度估计matlab仿真
  • 微信_网站提成方案点做南昌网站建设推广专家
  • Phoenix+Hbase和Doris两个方案如何选择,能不能拿Doris完全替代Phoenix+Hbase?有什么难点?
  • 免费网站大全下载全球速卖通卖家注册
  • 生物信息学 (101计划核心教程)Chapter4
  • 【疑难解答】@Value 注解不生效的原因
  • 【题解】【深基2.例2】英文字母
  • 关于建设殡葬网站的报告范文wordpress免费模板小而美
  • ssm项目,邮箱验证码
  • 多网卡同网段 IP 引发的 ARP Flux
  • 机器学习日报16
  • 11月份运维面试题
  • H100服务器维修“病历卡”:五大常见故障现象与根源分析
  • 9. Linux-riscv内存管理41-46问
  • 用mcu做灯光效果网站大连金州新区规划建设局网站
  • React 实战: Todo 应用学习小结
  • 网站性能优化方案网络设计及网络设计文档
  • 香港科技大学广州|可持续能源与环境学域博士招生宣讲会—兰州大学专场
  • 下午察:当机器人变得太像人
  • 青海城乡与建设厅网站个人简历简短范文
  • 黑马JAVAWeb -Vue工程化-API风格 - 组合式API
  • ubuntu更新nvidia显卡驱动
  • React Native 自建 JS Bundle OTA 更新系统:从零到一的完整实现与踩坑记录
  • 珠海建设网站公司代刷网站只做软件下载