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

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

相关推荐
Sunny_yiyi2 小时前
Java根据模版导出PDF文件
java·开发语言·pdf
麦兜*2 小时前
MongoDB 与 GraphQL 结合:现代 API 开发新范式
java·数据库·spring boot·mongodb·spring·maven·graphql
shan&cen2 小时前
Day02 集合 | 30. 串联所有单词的子串、146. LRU 缓存、811. 子域名访问计数
java·数据结构·算法·缓存
ITMan彪叔2 小时前
Java MQTT 主流开发方案对比
java·后端
沈艺强2 小时前
l2tp over ipsec lac 和lns 永久连接
网络
召摇2 小时前
Java 21到25的核心API演进总结
java·后端
ZeroNews内网穿透3 小时前
企业远程访问方案选择:何时选内网穿透,何时需要反向代理?
运维·服务器·网络·python·安全
知其然亦知其所以然3 小时前
SpringAI 玩转 OCI GenAI:这次我们聊聊 Cohere 聊天模型
java·后端·spring