package udptcp;
|
import java.net.DatagramPacket;
|
import java.net.DatagramSocket;
|
import java.net.InetAddress;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.Executors;
|
import java.util.concurrent.atomic.AtomicLong;
|
import dell_system.MessageViewPanel;
|
|
public class UDPPortBReceiver {
|
public static final int PORT = 7000;
|
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;
|
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());
|
packetCount.incrementAndGet();
|
// »ñÈ¡µ±Ç°Ê±¼äºÍʱ¼ä´Á
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
String time = sdf.format(new Date());
|
int timestamp = (int)(System.currentTimeMillis() / 1000);
|
|
// ±£´æµ½HexBaowen¼¯ºÏ
|
// µ÷ÓÃʱÌí¼Ó±¾µØ¶Ë¿Ú²ÎÊý
|
HexBaowen.intsert(ip, hexData, time, port, LOCAL_PORT, timestamp);
|
|
} 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();
|
}
|
}
|