From a8a90fd2d5040e66cc66b3da122a7f82561ff6f6 Mon Sep 17 00:00:00 2001 From: 826220679@qq.com <826220679@qq.com> Date: 星期六, 09 八月 2025 23:32:29 +0800 Subject: [PATCH] 优化了欢迎页面 --- src/udptcp/PacketProcessingSystem.java | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 104 insertions(+), 0 deletions(-) diff --git a/src/udptcp/PacketProcessingSystem.java b/src/udptcp/PacketProcessingSystem.java new file mode 100644 index 0000000..9ab4b4d --- /dev/null +++ b/src/udptcp/PacketProcessingSystem.java @@ -0,0 +1,104 @@ +package udptcp; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import dell55AAData.Dell55AA01Parser; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class PacketProcessingSystem { + // 线程安全的报文存储队列(集合A) + private static final ConcurrentLinkedQueue<HexPacket> packetQueue = new ConcurrentLinkedQueue<>(); + private static final AtomicBoolean isRunning = new AtomicBoolean(false); + private static final ExecutorService parserExecutor = Executors.newSingleThreadExecutor(); + private static Thread parserThread; + + // 报文存储结构 + public static class HexPacket { + public final String ip; + public final int port; + public final String hexData; + public final long timestamp; + + public HexPacket(String ip, int port, String hexData, long timestamp) { + this.ip = ip; + this.port = port; + this.hexData = hexData; + this.timestamp = timestamp; + } + } + + // 接收端存储报文(UDPPortAReceiver中调用) + public static void storePacket(String ip, int port, String hexData) { + if (packetQueue.size() < 100000) { // 限制队列大小防止OOM + packetQueue.offer(new HexPacket(ip, port, hexData, System.currentTimeMillis())); + } + } + + // 启动解析系统 + public static void startProcessing() { + if (isRunning.get()) return; + + isRunning.set(true); + parserThread = new Thread(() -> { + PacketParser bufferManager = new PacketParser(); + + while (isRunning.get()) { + HexPacket packet = packetQueue.poll(); + if (packet == null) { + Thread.yield(); // 队列为空时让出CPU + continue; + } + + try { + // 转换HEX为字节数据 + byte[] rawData = PacketParser.hexStringToBytes(packet.hexData); + // 追加到缓冲区并解析 + bufferManager.appendData(rawData, rawData.length); + List<PacketParser.DataPacket> parsedPackets = bufferManager.parsePackets(); + + // 处理解析后的数据包 + for (PacketParser.DataPacket p : parsedPackets) { + // 根据包头类型路由到不同解析器 + switch (p.getPacketType()) { + case 0x01: + processType01(p);break; + case 0x02: + processType02(p);break; + + default: + System.err.println("未知包类型: " + p.getPacketType()); + } + } + } catch (Exception e) { + System.err.println("解析错误: " + e.getMessage()); + } + } + }); + + parserThread.setDaemon(true); + parserThread.start(); + } + + // 停止解析系统 + public static void stopProcessing() { + isRunning.set(false); + parserExecutor.shutdownNow(); + if (parserThread != null) { + parserThread.interrupt(); + } + } + + // 示例解析方法(需根据实际协议实现) + private static void processType01(PacketParser.DataPacket packet) { + String hexData = PacketParser.bytesToHexString(packet.getPacket()); + Dell55AA01Parser.parse(hexData); + } + + private static void processType02(PacketParser.DataPacket packet) { + System.out.println("处理55AA02包: " + packet); + // 实际业务逻辑 + } + + // 其他类型处理方法... +} -- Gitblit v1.9.3