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