parent
75e960c2ca
commit
966f996b21
|
|
@ -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服务器已停止");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue