826220679@qq.com
9 天以前 fb883547ede83b1c758b1a9a025898ba3f83497a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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 dell_system.MessageViewPanel;
import dell_targets.Dell_SystemConfiguration;
 
public class UDPPortAReceiver {
    public static final int PORT =Dell_SystemConfiguration.hexport;
    @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 {
                             InetAddress address = packet.getAddress();
                                if (address == null) {
                                    System.err.println("Received packet with null address");
                                    return;
                                }
                                
                                String ip = address.getHostAddress();
                                int port = packet.getPort();
                                byte[] packetData = packet.getData();
                                int length = packet.getLength();
                                
                                if (packetData == null || length <= 0) {
                                    System.err.println("Invalid packet data");
                                    return;
                                }
                                
                                String hexData = bytesToHex(packetData, length);
                            // µ÷ÓÃʱÌí¼Ó±¾µØ¶Ë¿Ú²ÎÊý
                            PacketProcessingSystem.storePacket(ip, port, hexData);                            
                            // ±¨ÎIJ鿴´°¿ÚÏÔʾÊý¾Ý
                            MessageViewPanel.showData(hexData, ip, port, PORT,"UDPA","ALL","ALL");
                            // +++ Ôö¼Ó°ü¼ÆÊý +++
                            packetCount.incrementAndGet();  // ¹Ø¼üÐÞ¸´£ºÔö¼Ó¼ÆÊýÆ÷  
                        } catch (Exception e) {
                            System.err.println("Error processing UDP-A packet: ");
                            e.printStackTrace(); // Ìí¼ÓÏêϸ¶ÑÕ»¸ú×Ù
                        }
                    });
                }
            } 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();
    }
 
}