diff --git a/nex-be/src/main/java/com/unisinsight/project/udp/UDPServer.java b/nex-be/src/main/java/com/unisinsight/project/udp/UDPServer.java new file mode 100644 index 0000000..c4c8b4a --- /dev/null +++ b/nex-be/src/main/java/com/unisinsight/project/udp/UDPServer.java @@ -0,0 +1,93 @@ +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服务器已停止"); + } +} \ No newline at end of file