【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言

🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-ZEEKLOG博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~~

目录

1.UDP的API使用 

1.1DatagramSocket

1.2DatagramPacket 

2.实现回显服务器

2.1概念

2.2服务器的操作过程

1.初始化服务器

2.读取请求并解析

3.根据请求实现响应

4.把响应返回给客户端

5.客户端的IP和端口号打印

6.主函数的实现

2.3客户端的操作过程

1.初始化客户端

2.控制台输入请求

3.构造请求并且发送

4.读取服务器的响应

5.主函数的实现

2.4回显服务器基本流程

2.5打印日志分析

3.总结

 

1.UDP的API使用 

1.1DatagramSocket

这里负责对Socket进行读写,借助网卡进行数据的读写操作;

这里的初始化方法有以下几种:

DatagramSocket()创建一个UDP数据报套接字Socket,绑定到本机的随意的一个端口(客户端)
DatagramSocket(int port)创建一个UDP数据报套接字Socket,绑定到本机的指定的一个端口(服务器)

 还包括实现那套接字的方法:

receive(DatagramPacket p)使用套接字实现数据的读取
send(DatagramPacket p)使用套接字实现数据的写入

注意:这里的DatagramPacket就是一个输出型参数 

1.2DatagramPacket 

       接着上面,小编提到这里的DatagramPacket是一个输出型参数,和前面实现文件IO的操作类似的,这里的就是一个UDP数据报,是接收和发送数据的基本单位;

2.实现回显服务器

2.1概念

回显服务器:相当于我们之前学习的输出hello world,这里的回显服务器代表的是没有任何逻辑过程,即客户端请求啥就直接响应啥;

2.2服务器的操作过程

1.初始化服务器

代码如下:

public class UDPServer { //构造方法 private DatagramSocket socket=null; public UDPServer(int port) throws SocketException { //通过socket对网卡进行数据的操作 socket=new DatagramSocket(port); }

注意:

1.我们所有的对于网卡的操作就是借用这里的socket实现,这里的port是一个端口号,服务器是可控的所以这里就要指定一个端口号;

2.抛出异常,当端口号被一个进程占用了,那么端口号就创建失败了,一个端口号只能被一个进程占用,但是一个进程可以占用多个端口号;

2.读取请求并解析

代码如下:

public void start() throws IOException { System.out.println("服务器启动!"); while (true) { // 每次循环, 就是处理一个请求-响应过程. // 1. 读取请求并解析 DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096); socket.receive(requestPacket); // 读到的字节数组, 转成 String 方便后续的逻辑处理. String request = new String(requestPacket.getData(), 0, requestPacket.getLength());

注意:

1.这里的死循环是为了表示,服务器是24小时不间断的,所以没有必要进行退出的操作;

2.通过DatagramPacket设置保存这里的读取到的字节信息,这是一个输出型参数;

3.此时的receive就能读取到UDP数据报的的内容,存放到requestPacket字节数组中;并且这里还知道原IP端口是啥(即数据从哪里来的)

4.最后将这里的字节类型的数据转化为字符串类型的数据,字节数组里不一定就是二进制的数据,还可能是文本类型的数据,使用string保存恰到好处;

3.根据请求实现响应

代码如下:

 String response = process(request); public String process(String request) { return request; }

注意:

由于回显服务器是没有业务逻辑的,所以在实现对应的响应的时候,直接放回输出的请求即可

4.把响应返回给客户端

代码如下:

 // 3. 把响应返回到客户端. // 构造一个 DatagramPacket 作为响应对象 DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length, requestPacket.getSocketAddress()); socket.send(responsePacket);

注意

1.这里的实现对于字符串的操作,把string的字节数组给提取出来;

2.这里还使用了socketAddress实现,得到INetAddress对象,包含了客户端的的IP和端口号,即客户端的数据报;

5.客户端的IP和端口号打印

代码如下:

 System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(), requestPacket.getPort(), request, respond);

注意:

这里代表的就是客户端的IP,端口号,以及请求和响应;

6.主函数的实现

代码如下:

public static void main(String[] args) throws IOException { UDPServer udpServer=new UDPServer(9090); udpServer.start(); }

注意:

 这里的9090是我们程序员规定的服务器的端口号;

2.3客户端的操作过程

1.初始化客户端

代码如下:

public class UDPClient { private DatagramSocket socket=null; private String ServerIP; private int ServerPort; public UDPClient(String serverIP,int serverPort) throws SocketException { this.ServerIP= serverIP; this.ServerPort=serverPort; socket=new DatagramSocket(); }

注意:

这里要设置要请求的服务器的IP和端口号,因为发起请求就是要知道服务器在哪里;这里和上面日志的打印是一致的,请求的IP是客户端的本机IP,客户端是系统随机分配的;

2.控制台输入请求

代码如下:

 public void start() throws IOException { System.out.println("客户端启动"); Scanner sc=new Scanner(System.in); while (true){ System.out.println("->"); if (!sc.hasNext()){ break; }

注意:

这里和服务器是一致的,都是24小时不间断的,这里的sc.hashnext是为了表示没有更多的的输入了,那么就返回false去反后就跳出循环;

3.构造请求并且发送

代码如下:

String request=sc.next(); DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ServerIP),ServerPort); //来自哪里的信息 socket.send(requestPacket);

注意:

这里就是通过字符串转为字节数据,并且指定发送的端口号和IP地址,最后通过send进行发送数据,请求服务器;

4.读取服务器的响应

代码如下:

// 4. 读取服务器的响应. DatagramPacket respondPacket=new DatagramPacket(new byte[1024],1024); socket.receive(respondPacket); String respond=new String(respondPacket.getData(),0,respondPacket.getLength()); System.out.println(respond);

注意:

这里就规定传输的数据单位,通过接收服务器传来的响应,保存到字节数组里面,最后转为string字符串类型的数据,在实现打印

5.主函数的实现
public static void main(String[] args) throws IOException { UDPClient udpClient=new UDPClient("127.0.0.1", 9090); udpClient.start(); }

注意:

这里的“127.0.0.1”是本机的IP地址,9090是我们输入的服务器端口号;

2.4回显服务器基本流程

如下图片的实现过程:

小编这里由于宽度不够就无法完全分开,请见谅~~~以上就是具体的实现过程

第一步:服务器启动进入receive,发现没有请求,那么就直接进入阻塞;

具体代码:

 DatagramPacket requestPacket=new DatagramPacket(new byte[1024],1024); //通过接收的方法进行数据的传入 socket.receive(requestPacket);

 第二步:客户端进入循环,执行到sc.hashnext进入阻塞,知道用户输入内容;

具体代码:

 System.out.println("->"); if (!sc.hasNext()){ break; }

第三步:输入请求的内容,转化为字节类型数据,指定服务器IP和端口号,发送请求

具体代码:

 String request=sc.next(); DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ServerIP),ServerPort); //来自哪里的信息 socket.send(requestPacket);

第四步:服务器解除阻塞,读取DatagramRocket对象,构造string需求,根据需求执行响应操作,最后返回构造响应对象,并进行send发送的操作;这个过程客户端阻塞

具体代码:

 String request=new String(requestPacket.getData(),0,requestPacket.getLength()); //注意这里的长度是字节的长度,不是字符串的长度 //进行响应的操作 String respond=process(request); //发送响应,转化为面向数据包的类型 DatagramPacket respondPacket=new DatagramPacket(respond.getBytes(),respond.getBytes().length, requestPacket.getSocketAddress()); //最后发送这个数据 socket.send(respondPacket);

第五步:客户端接收服务器传来的数据,存储在字节数组中,然后转化为字符串数据类型,实现打印在控制台上;

具体代码:

 DatagramPacket respondPacket=new DatagramPacket(new byte[1024],1024); socket.receive(respondPacket); String respond=new String(respondPacket.getData(),0,respondPacket.getLength()); System.out.println(respond);

2.5打印日志分析

这里我们启动服务器和客户端后,进行输入:

这里我们就可以看到输出一个nihao那么就返回一个nihao,那么我们可以看看服务器的打印日志

如下图:

此时注意前面两个第一个是“127.0.0.1”是我们自己的本机IP地址,并且后面这个就是请求的端口;

3.总结

 💬💬本期小编主要讲解了UDP的API的使用,并且通过UDP提供的API实现回显服务器的实现,当然这里设计到服务器和客户端两边的实现过程~~~

具体代码已上传gitee,代码在这里:network: 网络编程

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!! 


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                             😊😊  期待你的关注~~~

Read more

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

摘要:本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求,帮助开发者真正实现OpenClaw从“能用”到“放心用”的跨越。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言  一、实验基础说明 1.1、互斥体简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 互斥体 LED 驱动代码(mutex.c) 3.2.1、设备结构体定义(28-39

By Ne0inhk
Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做? 1. 对着文档,手写 Dart Model 类(容易写错字段类型)。 2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。 3. 当后端修改了字段名,你对着报错修半天。 这是重复劳动的地狱。 swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括: * Model 类:支持 json_serializable,带 fromJson/

By Ne0inhk
Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

文章目录 * 前言 * make/makefile * 文件的三个时间 * Linux第一个小程序-进度条 * 回车和换行 * 缓冲区 * 程序的代码展示 * git指令 * 关于gitee * Linux调试器-gdb使用 * 作业部分 前言 做 Linux 开发时,你是不是也遇到过这些 “卡脖子” 时刻?写 makefile 时,明明语法没错却报错,最后发现是依赖方法行没加 Tab;想提交代码到 gitee,记不清 git add/commit/push 的 “三板斧”,还得反复搜教程;用 gdb 调试程序,输了命令没反应,才想起编译时没加-g生成 debug 版本;甚至连写个进度条,都搞不懂\r和\n的区别,导致进度条乱跳…… 其实这些问题,

By Ne0inhk