一、具体实现

  • FixedLengthPacketHandler.java
public class FixedLengthPacketHandler {

    private final int packetLength;
    private byte[] buffer = new byte[0];

    public FixedLengthPacketHandler(int packetLength) {
        this.packetLength = packetLength;
    }

    public List<byte[]> handleData(byte[] data) {

        // 将新数据合并到缓冲区
        byte[] newBuffer = new byte[buffer.length + data.length];
        System.arraycopy(buffer, 0, newBuffer, 0, buffer.length);
        System.arraycopy(data, 0, newBuffer, buffer.length, data.length);
        buffer = newBuffer;

        List<byte[]> completePackets = new ArrayList<>();

        while (buffer.length >= packetLength) {

            // 提取完整数据包
            byte[] packet = new byte[packetLength];
            System.arraycopy(buffer, 0, packet, 0, packetLength);
            completePackets.add(packet);

            // 移除已提取的完整数据包
            byte[] remainingBuffer = new byte[buffer.length - packetLength];
            System.arraycopy(buffer, packetLength, remainingBuffer, 0, remainingBuffer.length);
            buffer = remainingBuffer;
        }

        return completePackets;
    }

    public List<String> handleStringData(String data) {
        byte[] bytes = data.getBytes();
        List<byte[]> packets = handleData(bytes);
        List<String> packetStrings = new ArrayList<>();
        for (byte[] packet : packets) {
            packetStrings.add(new String(packet));
        }
        return packetStrings;
    }

    public void clear() {
        buffer = new byte[0];
    }

    public byte[] peek() {
        byte[] copy = new byte[buffer.length];
        System.arraycopy(buffer, 0, copy, 0, buffer.length);
        return copy;
    }

    public String peekString() {
        return new String(peek());
    }
}

二、测试用例

  1. 单个完整数据包
String data = "Hello";

FixedLengthPacketHandler handler = new FixedLengthPacketHandler(5);
List<String> result = handler.handleStringData(data);

System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + handler.peekString());
# 输出结果

输入: Hello
输出: [Hello]
缓冲区: 
  1. 多个完整数据包
String data = "HelloWorldJava~";

FixedLengthPacketHandler handler = new FixedLengthPacketHandler(5);
List<String> result = handler.handleStringData(data);

System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + handler.peekString());
# 输出结果

输入: HelloWorldJava~
输出: [Hello, World, Java~]
缓冲区: 
  1. 不完整数据包
String data = "Hel";

FixedLengthPacketHandler handler = new FixedLengthPacketHandler(5);
List<String> result = handler.handleStringData(data);

System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + handler.peekString());
# 输出结果

输入: Hel
输出: []
缓冲区: Hel
  1. 分包处理,粘包与拆包
String data_part1 = "HelloWor";
String data_part2 = "ldJava";

FixedLengthPacketHandler handler = new FixedLengthPacketHandler(5);

List<String> result1 = handler.handleStringData(data_part1);
System.out.println("第一次输入: " + data_part1);
System.out.println("第一次输出: " + result1);
System.out.println("第一次缓冲区: " + handler.peekString());

List<String> result2 = handler.handleStringData(data_part2);
System.out.println("第二次输入: " + data_part2);
System.out.println("第二次输出: " + result2);
System.out.println("第二次缓冲区: " + handler.peekString());
# 输出结果

第一次输入: HelloWor
第一次输出: [Hello]
第一次缓冲区: Wor
第二次输入: ldJava
第二次输出: [World]
第二次缓冲区: Java
  1. 分包处理,完整包 + 不完整包
String data = "HelloWorldJav";

FixedLengthPacketHandler handler = new FixedLengthPacketHandler(5);
List<String> result = handler.handleStringData(data);

System.out.println("输入: " + data);
System.out.println("输出: " + result);
System.out.println("缓冲区: " + handler.peekString());
# 输出结果

输入: HelloWorldJav
输出: [Hello, World]
缓冲区: Jav
  1. 复杂分包处理
String data1 = "He";
String data2 = "llo";
String data3 = "Worl";
String data4 = "dJav";
String data5 = "aPro";

FixedLengthPacketHandler handler = new FixedLengthPacketHandler(5);

List<String> result1 = handler.handleStringData(data1);
System.out.println("输入1: " + data1 + " -> 输出: " + result1 + " - 缓冲区: " + handler.peekString());

List<String> result2 = handler.handleStringData(data2);
System.out.println("输入2: " + data2 + " -> 输出: " + result2 + " - 缓冲区: " + handler.peekString());

List<String> result3 = handler.handleStringData(data3);
System.out.println("输入3: " + data3 + " -> 输出: " + result3 + " - 缓冲区: " + handler.peekString());

List<String> result4 = handler.handleStringData(data4);
System.out.println("输入4: " + data4 + " -> 输出: " + result4 + " - 缓冲区: " + handler.peekString());

List<String> result5 = handler.handleStringData(data5);
System.out.println("输入5: " + data5 + " -> 输出: " + result5 + " - 缓冲区: " + handler.peekString());
# 输出结果

输入1: He -> 输出: [] - 缓冲区: He
输入2: llo -> 输出: [Hello] - 缓冲区: 
输入3: Worl -> 输出: [] - 缓冲区: Worl
输入4: dJav -> 输出: [World] - 缓冲区: Jav
输入5: aPro -> 输出: [JavaP] - 缓冲区: ro
Logo

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

更多推荐