UDP网络编程:【Java】无连接通信到Socket实战(二)

发布于:2025-09-14 ⋅ 阅读:(23) ⋅ 点赞:(0)


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可安全退出程序