一、具体实现
- 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]
缓冲区: 半包消息