当前位置: 首页 > news >正文

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

前言

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

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

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

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

目录

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: 网络编程

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


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

                             😊😊  期待你的关注~~~

相关文章:

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

前言 🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…...

C语言复习第3章 函数

目录 一、函数介绍1.1 函数是什么1.2 C语言中函数的分类1.3 函数原型1.4 高内聚 低耦合1.5 C语言main函数的位置 二、函数的参数2.1 实参和形参2.2 函数的参数(实参)可以是表达式2.3 传值与传址(swap函数)2.4 明确形参是实参的临时拷贝2.5 void(如果不写函数返回值 默认是int)2…...

Golang | Leetcode Golang题解之第491题非递减子序列

题目: 题解: var (temp []intans [][]int )func findSubsequences(nums []int) [][]int {ans [][]int{}dfs(0, math.MinInt32, nums)return ans }func dfs(cur, last int, nums []int) {if cur len(nums) {if len(temp) > 2 {t : make([]int, len(…...

conan安装方法简介

因为conan是使用python开发的,所以使用conan需要先安装python环境,这里就不展开python的安装方法了。 conan安装有多种方法,但是比较推荐也是比较简单的一种方法是使用python的pip包管理器安装,相关方法如下(Windows和…...

Java面试指南:Java基础介绍

这是《Java面试指南》系列的第1篇,本篇主要是介绍Java的一些基础内容: 1、Java语言的起源 2、Java EE、Java SE、Java ME介绍 3、Java语言的特点 4、Java和C的区别和联系? 5、面向对象和面向过程的比较 6、Java面向对象的三大特性&#xff1a…...

【mod分享】波斯王子遗忘之沙高清重置,纹理,字体,贴图全部重置,特效增强,支持光追

各位好,今天小编给大家带来一款新的高清重置MOD,本次高清重置的游戏叫《波斯王子:遗忘之沙》。 《波斯王子:遗忘之沙》是由育碧(Ubisoft)开发并发行的一款动作类游戏,于2010年5月18日发行。游戏…...

【计网笔记】物理层

设备 中继器:延长信号传播长度集线器:RJ45接口,无碰撞检测 接口特性 不属于物理层接口规范定义范畴的是(C) A. 接口形状 B. 引脚功能 C. 物理地址 D. 信号电平 传输媒体 导引型媒体 双绞线 减少对相邻导线的电磁…...

《计算机视觉》—— 基于 dlib 库的方法将两张人脸图片进行换脸

声明:此篇文章所用的明星照片只为用于演示代码的效果,无诋毁她人肖像之意 一、案例实现的思想 此案例的核心是基于人脸68个关键点检测模型来实现的,人脸68个关键带点检测后的效果如下: 通过对上图中红色区域的转换,…...

查找与排序-交换排序

交换排序是基于“比较”和“交换”两种操作来实现的排序方法 。 由于选择“比较”的基准元素不同,可将交换排序分为以下两种: 冒泡排序快速排序 一、冒泡排序 1.冒泡排序基本思想 因为其实现与气泡从水中往上冒的过程类似而得名。 每一趟的…...

数据结构与算法:高级数据结构与实际应用

目录 14.1 跳表 14.2 Trie树 14.3 B树与 B树 14.4 其他高级数据结构 总结 数据结构与算法:高级数据结构与实际应用 本章将探讨一些高级数据结构,这些数据结构在提高数据存取效率和解决复杂问题上起到重要作用。这些高级数据结构包括跳表&#xff0…...

【win11】终端/命令提示符/powershell美化

文章目录 1.设置字体1.1. 打开win11的终端/命令提示符/powershell其中之一1.2. 打开终端设置,修改所有终端默认字体为新宋体 2. 修改powershell背景色为蓝色 win11的默认终端/命令提示符/powershell主题风格让人感觉与win10撕裂太大,尤其是字体、背景色&…...

三元损失(Triplet Loss)详解

文章目录 前言一、三元损失的核心思想二、数学公式三、损失函数的解释四、三元损失的优势五、应用场景前言 三元损失(Triplet Loss)是一种广泛应用于度量学习(Metric Learning)中的损失函数,尤其在人脸识别、图像检索等任务中表现优异。三元损失的基本思想是通过定义一个…...

1. 解读DLT698.45-2017通信规约--预连接响应

国家电网有限公司企业标准,面向对象的用电信息数据交换协议DLT698.45-2017 为提高用电信息采集系统的业务适应性、采集效率、安全性和数据溯源性,规范用电信息数据交换协议的通信架构、数据链路层、应用层、接口类与对象标识,制定本标准。 …...

基于小波图像去噪的MATLAB实现

论文背景 数字图像处理(Digital Image Processing,DIP)是指用计算机辅助技术对图像信号进行处理的过程。数字图像处理最早出现于 20世纪50年代,随着过去几十年来计算机、网络技术和通信的快速发展,为信号处理这个学科领域的发展奠定了基础&a…...

[数据结构]栈的实现与应用

文章目录 一、引言二、栈的基本概念1、栈是什么2、栈的实现方式对比3、函数栈帧 三、栈的实现1、结构体定义2、初始化3、销毁4、显示5、数据操作 四、分析栈1、优点2、缺点 五、总结1、练习题2、源代码 一、引言 栈,作为一种基础且重要的数据结构,在计算…...

ESP32-C3 入门笔记04:gpio_key 按键 (ESP-IDF + VSCode)

1.GPIO简介 ESP32-C3是QFN32封装,GPIO引脚一共有22个,从GPIO0到GPIO21。 理论上,所有的IO都可以复用为任何外设功能,但有些引脚用作连接芯片内部FLASH或者外部FLASH功能时,官方不建议用作其它用途。 通过开发板的原…...

C语言(函数)—函数栈帧的创建和销毁

目录 前言 补充知识 一、函数线帧是什么? 二、函数线帧的实现(举例说明) 两数之和代码 ​编辑两数之和 汇编代码分析 执行第一条语句 执行第二条语句 执行第三条语句 执行第四、五、六条语句 执行第七条语句 执行第八、九、十条语句 执行第十…...

点餐小程序实战教程20广告管理

目录 1 创建数据源2 添加轮播容器3 创建变量4 绑定变量5 预览应用总结 一般餐厅需要有一些宣传,在我们的点餐页面可以在顶部加载广告位。广告主要是用轮播图的形式进行展示,本节我们介绍一下如果显示广告。 1 创建数据源 打开控制台,点击应用…...

市场上几个跨平台开发框架?

跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上,开发者需要为每个操作系统编写不同的代码,使用不同的开发工具和语言。而跨平台桌面应用开发框架通过…...

同步和异步、引用、变量声明、全局变量

同步和异步 如果计算机足够快,任何资源的访问速度都像Cache一样,没有异步的必要。 编程语言的同步和异步 越早期的编程语言,支持语言级别的异步越欠缺。 JS提供某些操作的同步和异步函数,例如文件读取,fs.readFile和fs…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...