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服务器已停止"); } }