Java 开发 - 粘包处理器 - 基于固定长度消息实现
·
一、具体实现
- 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());
}
}
二、测试用例
- 单个完整数据包
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]
缓冲区:
- 多个完整数据包
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~]
缓冲区:
- 不完整数据包
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
- 分包处理,粘包与拆包
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
- 分包处理,完整包 + 不完整包
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
- 复杂分包处理
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
更多推荐


所有评论(0)