package udptcp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicLong; import publicsWay.PacketProcessingSystem; public class UDPPortBReceiver { public static final int PORT = 7000; @SuppressWarnings("unused") private static final int MAX_DEVICES = 50000; private static final AtomicLong packetCount = new AtomicLong(0); private static final ExecutorService executor = Executors.newFixedThreadPool(10); private static DatagramSocket socket; private static volatile boolean isRunning = false; private static Thread receiverThread; @SuppressWarnings("unused") private static final int LOCAL_PORT = PORT; // ¶¨Òå±¾µØ¶Ë¿Ú // Æô¶¯½ÓÊÕÆ÷µÄ¾²Ì¬·½·¨ public static void startReceiver() { if (isRunning) return; isRunning = true; receiverThread = new Thread(() -> { try { socket = new DatagramSocket(PORT); byte[] buffer = new byte[2048]; while (isRunning) { DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); executor.execute(() -> { try { String ip = packet.getAddress().getHostAddress(); int port = packet.getPort(); String hexData = bytesToHex(packet.getData(), packet.getLength()); // µ÷ÓÃʱÌí¼Ó±¾µØ¶Ë¿Ú²ÎÊý PacketProcessingSystem.storePacket(ip, port, hexData); } catch (Exception e) { System.err.println("Error processing UDP-A packet: " + e.getMessage()); } }); } } catch (Exception e) { System.err.println("UDP-A Server crashed: " + e.getMessage()); } finally { if (socket != null && !socket.isClosed()) { socket.close(); } } }); receiverThread.setDaemon(true); receiverThread.start(); } // Í£Ö¹½ÓÊÕÆ÷ public static void stopReceiver() { isRunning = false; if (socket != null && !socket.isClosed()) { socket.close(); } executor.shutdown(); } // ·¢ËÍÊý¾Ýµ½Ö¸¶¨É豸 public static void sendData(String ip, int port, String data, boolean isHex) { try { byte[] sendBytes; if (isHex) { // HEX¸ñʽ·¢ËÍ£º½«Ê®Áù½øÖÆ×Ö·û´®×ª»»Îª×Ö½ÚÊý×é sendBytes = hexStringToByteArray(data); } else { // ASCII¸ñʽ·¢ËÍ£ºÖ±½Ó»ñÈ¡×Ö½ÚÊý×é sendBytes = data.getBytes(); } InetAddress address = InetAddress.getByName(ip); DatagramPacket packet = new DatagramPacket(sendBytes, sendBytes.length, address, port); socket.send(packet); } catch (Exception e) { System.err.println("Error sending UDP data: " + e.getMessage()); } } private static String bytesToHex(byte[] bytes, int length) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { sb.append(String.format("%02X", bytes[i])); } return sb.toString(); } private static byte[] hexStringToByteArray(String hex) { hex = hex.replaceAll("\\s", ""); // ÒÆ³ýËùÓпոñ int len = hex.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { // ´¦ÀíÿÁ½¸ö×Ö·û×÷Ϊһ¸ö×Ö½Ú data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i+1), 16)); } return data; } public static long getPacketCount() { return packetCount.get(); } }