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 byteBUFFER_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 byte1024;

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

相关推荐
其美杰布-富贵-李20 分钟前
Spring Boot 依赖注入说明文档
java·spring boot·python
tachibana225 分钟前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
our_times30 分钟前
2026年Java开发者破局指南:Spring AI 2.0 与 Agent 开发实战
java·人工智能·spring
运维行者_39 分钟前
如何查看每个IP的带宽使用情况?NetFlow 技术实战指南
开发语言·网络·分布式·后端·架构·带宽
振浩微433射频芯片42 分钟前
工业遥控器总在关键时刻“掉链子”?——433MHz芯片方案如何破局
网络·单片机·嵌入式硬件·物联网·工业遥控
糖果店的幽灵1 小时前
langgraph的四种state解析
java·前端·javascript·langgraph
AGCSDNl1 小时前
线上起名网站深度测评
网络
杨充1 小时前
4.接口而非实现编程
java·后端·架构
梦梦代码精1 小时前
基于ThinkPHP6 + Vue3的家政预约系统全解析:从LBS定位到自动派单的完整实现
java·docker·开源·php·代码规范
wear工程师1 小时前
@Transactional 标了却没开事务?先看这次调用有没有经过代理
java·spring