import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UDPServer {
private static final int PORT = 9876;
private static final int BUFFER_SIZE = 1024;
private static final int THREAD_POOL_SIZE = 10;
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
try (DatagramSocket serverSocket = new DatagramSocket(PORT)) {
System.out.println("UDP Server started on port " + PORT);
while (true) {
byte[] receiveData = new byte[BUFFER_SIZE];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
threadPool.execute(new ClientHandler(serverSocket, receivePacket));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}
static class ClientHandler implements Runnable {
private final DatagramSocket socket;
private final DatagramPacket packet;
public ClientHandler(DatagramSocket socket, DatagramPacket packet) {
this.socket = socket;
this.packet = packet;
}
@Override
public void run() {
try {
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("Received from " + packet.getAddress() + ":" + packet.getPort() + " - " + message);
String response = "ECHO: " + message;
byte[] sendData = response.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, packet.getAddress(), packet.getPort());
socket.send(sendPacket);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
wap.ersaonongjiale.cn/4896
wap.ersaonongjiale.cn/0048
wap.ersaonongjiale.cn/6511
wap.ersaonongjiale.cn/1986
wap.ersaonongjiale.cn/2809
wap.ersaonongjiale.cn/4246
wap.ersaonongjiale.cn/4448
wap.ersaonongjiale.cn/2432
wap.ersaonongjiale.cn/6421
wap.ersaonongjiale.cn/7583
wap.antengtc.cn/4968
wap.antengtc.cn/4118
wap.antengtc.cn/4496
wap.antengtc.cn/9289
wap.antengtc.cn/5365
wap.antengtc.cn/7614
wap.antengtc.cn/8097
wap.antengtc.cn/5740
wap.antengtc.cn/4990
wap.antengtc.cn/8780
wap.sydhfj.cn/1539
wap.sydhfj.cn/6892
wap.sydhfj.cn/5991
wap.sydhfj.cn/6996
wap.sydhfj.cn/1919
wap.sydhfj.cn/5093
wap.sydhfj.cn/9384
wap.sydhfj.cn/8862
wap.sydhfj.cn/6653
wap.sydhfj.cn/1323
wap.practicle.cn/1200
wap.practicle.cn/6946
wap.practicle.cn/0430
wap.practicle.cn/2540
wap.practicle.cn/3265
wap.practicle.cn/5491
wap.practicle.cn/8886
wap.practicle.cn/9410
wap.practicle.cn/5199
wap.practicle.cn/1792
import java.net.*;
import java.util.Scanner;
public class UDPClient {
private static final String SERVER_IP = "127.0.0.1";
private static final int SERVER_PORT = 9876;
private static final int TIMEOUT_MS = 3000;
public static void main(String[] args) {
try (DatagramSocket clientSocket = new DatagramSocket();
Scanner scanner = new Scanner(System.in)) {
clientSocket.setSoTimeout(TIMEOUT_MS);
InetAddress serverAddress = InetAddress.getByName(SERVER_IP);
while (true) {
System.out.print("Enter message (type 'exit' to quit): ");
String message = scanner.nextLine();
if ("exit".equalsIgnoreCase(message)) break;
byte[] sendData = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, serverAddress, SERVER_PORT);
clientSocket.send(sendPacket);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
try {
clientSocket.receive(receivePacket);
String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("Server response: " + response);
} catch (SocketTimeoutException e) {
System.out.println("Request timed out");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端采用线程池处理并发请求,每个客户端请求由独立线程处理
客户端实现超时重试机制,3秒内未收到响应显示超时提示
项目配置为Maven工程,支持直接通过exec-maven-plugin运行
服务端实现简单的ECHO功能,将客户端消息原样返回并添加前缀
客户端支持交互式输入,输入exit可安全退出程序