feat(nex-be): 添加 UDP服务器功能

- 实现了一个监听
master
chenhao 2025-09-11 14:22:42 +08:00
parent 75e960c2ca
commit 966f996b21
1 changed files with 93 additions and 0 deletions

View File

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