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();
}
}
二、测试用例
- 正常单条消息
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]
缓冲区:
- 粘包,两条消息粘在一起
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]
缓冲区:
- 粘包,三条消息粘在一起
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#
输出: [用户登录, 订单创建, 心跳检测]
缓冲区:
- 半包,消息被分割
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#
输出: [这是一条未完整的消息]
缓冲区:
- 混合情况,粘包 + 半包
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]
缓冲区: 半包消息
更多推荐


所有评论(0)