vdi/nex-be/src/main/java/com/unisinsight/project/udp/UDPServer.java

93 lines
3.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.unisinsight.project.udp;
import cn.hutool.extra.spring.SpringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
@Component
public class UDPServer {
private static final Logger logger = LoggerFactory.getLogger(UDPServer.class);
private static final int PORT = 8115;
private DatagramSocket socket;
private Thread serverThread;
private volatile boolean running = false;
@PostConstruct
public void start() {
try {
socket = new DatagramSocket(PORT);
running = true;
serverThread = new Thread(() -> {
byte[] buffer = new byte[1024];
while (running) {
try {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
// 处理接收到的数据
handlePacket(packet);
} catch (IOException e) {
if (running) {
logger.error("UDP服务器接收数据时发生错误", e);
}
}
}
});
serverThread.start();
logger.info("UDP服务器已启动监听端口: {}", PORT);
} catch (SocketException e) {
logger.error("UDP服务器启动失败端口: {}", PORT, e);
}
}
private void handlePacket(DatagramPacket packet) {
try {
// 获取客户端地址和端口
InetAddress clientAddress = packet.getAddress();
int clientPort = packet.getPort();
// 获取主机IP地址
String hostIP = InetAddress.getLocalHost().getHostAddress();
String serverPort = SpringUtil.getProperty("server.port");
// 将主机IP地址发送回客户端
byte[] responseData = hostIP.getBytes();
DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, clientAddress, clientPort);
socket.send(responsePacket);
logger.info("已向客户端 {}/{} 返回主机IP地址: {}:{}", clientAddress.getHostAddress(), clientPort, hostIP, serverPort);
} catch (UnknownHostException e) {
logger.error("无法获取本机IP地址", e);
} catch (IOException e) {
logger.error("向客户端发送数据时发生错误", e);
}
}
@PreDestroy
public void stop() {
running = false;
if (socket != null && !socket.isClosed()) {
socket.close();
}
if (serverThread != null) {
serverThread.interrupt();
}
logger.info("UDP服务器已停止");
}
}