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

相关推荐
-雷阵雨-5 分钟前
数据结构——栈和队列(模拟实现)
java·开发语言·数据结构·intellij-idea
字节高级特工18 分钟前
网络协议分层与Socket编程详解
linux·服务器·开发语言·网络·c++·人工智能·php
祈祷苍天赐我java之术28 分钟前
Redis 热点数据与冷数据解析
java·redis·mybatis
9号达人1 小时前
Java20 新特性详解与实践
java·后端·面试
sniper_fandc1 小时前
关于Mybatis-Plus的insertOrUpdate()方法使用时的问题与解决—数值精度转化问题
java·前端·数据库·mybatisplus·主键id
天若有情6732 小时前
Spring配置文件XML验证错误全面解决指南:从cvc-elt.1.a到找不到‘beans‘元素声明
xml·java·spring
熊小猿2 小时前
ArrayList 与 LinkedList 的区别
java·面试
light_in_hand2 小时前
NAT 机制的工作流程
网络
Pan Zonghui2 小时前
腾讯云COS通过CDN加速配置指南
网络·云计算·腾讯云
FPGA_Linuxer2 小时前
vivado自定义IP显示只读解决办法
网络·网络协议·tcp/ip