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();
|
}
|
|
}
|