93 lines
3.1 KiB
Java
93 lines
3.1 KiB
Java
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服务器已停止");
|
||
}
|
||
} |