一、具体实现

  • 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]
缓冲区: 半包消息
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐