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

相关推荐
wuminyu2 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
其实防守也摸鱼3 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ4 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
S1998_1997111609•X4 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
wbs_scy5 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
AI精钢5 小时前
AI Agent 从上线到删库跑路始末
网络·人工智能·云原生·aigc
jinanwuhuaguo6 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
笨笨饿6 小时前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
xmjd msup7 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
geneculture7 小时前
《智能通信速分多次传输技术(VDMT)》专利文件的全文汉英双语对照版本
服务器·网络·人工智能·融智学的重要应用·哲学与科学统一性·融智时代(杂志)·人机间性