【JavaEE】网络编程——UDP

🤡🤡🤡个人主页🤡🤡🤡
🤡🤡🤡JavaEE专栏🤡🤡🤡
文章目录
- 1.数据报套接字(UDP)
- 1.1特点
- 1.2编码
- 1.2.1DatagramSocket
- 1.2.2DatagramPacket
- 1.2.3实现一个UDP(24*7)回显服务器
- 1.2.4实现一个UDP客户端
- 1.2.5实现一个UDP字典翻译服务器
- 2.客户端与服务器的流程
1.数据报套接字(UDP)
1.1特点
- 无连接:数据在传输前无需建立专用通道,每一个数据包独立发送,并自行选择路径到达目的地,好比发送信息,你只要发送了信息就行,不需要对方接收。
- 不可靠传输:在传输数据的时候,不需要关注对方是否收到了,发送了就可以。
- 面向数据流:传输数据的基本单位是一个个的UDP数据报,一次读写,只能读写一个完整的UDP数据报
- 全双工:一条链路中,能够进行双向通信。
1.2编码
Socket api都是系统提供的,不同的系统提供的api是不一样的,但是java中对于系统的这些api进一步封装了。
UDP中的socket api 重点是两个类:DatagramSocket 和DatagramPacket
1.2.1DatagramSocket
这个类的作用可以看作"操作网卡"的遥控器,也就是对网卡进行读写操作,可以理解成像文件那样读写的形式。
提供了几个方法:

1.2.2DatagramPacket
这个类是描述UDP数据报,一个DatagramPacket对象相当于一个UDP数据报,一次发送一次接收就是传输了一个DatagramPacket对象。
1.2.3实现一个UDP(24*7)回显服务器
回显(Echo):客户端给服务器发送不同的请求,服务器就会返回不同的响应。但在此处回显就是客户端给服务器请求啥,服务器就响应啥,不做任何计算和业务逻辑。
public class udpEchoServer {public DatagramSocket socket = null;public udpEchoServer(int port) throws SocketException {socket = new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动!!!");while (true) {//接受客户端请求DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//为了更好处理数据并方便打印,将接受的数据转化为字符串操作String request = new String(requestPacket.getData(),0,requestPacket.getLength());//处理客户端的请求(算术计算或者业务逻辑)String response = this.process(request);//将处理完的请求返还给客户端DatagramPacket resposePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());socket.send(resposePacket);//打印客户端的ip地址端口号和接收客户端的数据以及处理完客户端后的数据System.out.printf("[%s:%d] req = %s,resp = %s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);}}public String process(String request) {return request;}public static void main(String[] args) throws IOException {udpEchoServer udpEchoServer = new udpEchoServer(9999);udpEchoServer.start();}
}

DatagramPacket对象表示的就是一个数据报,UDP数据报是由报头和载荷组成的,报头中的有IP地址和端口号这些都是DatagramPacket类的属性,而载荷这个类没有提供,所以需要程序猿自己去提供,所以就像和尚化缘一样,你需要自己提供一个化缘的碗,然后各家将食物放到碗中,由于数据报的本质就是一个二进制数据,所以我提供了一个字节数组来作为这个载荷存储数据。

从客户端接收过来的数据,经过服务器处理完之后要返还给客户端,所以需要在创建一个DatagramPacket对象来存储由服务器处理完之后的数据,再服务器发送给客户端。此时的DatagramPacket对象就不需要提供一个空白的空间,将处理完的数据放入这个对象就行,由于在接收数据的时候就记录了客户端的ip地址和端口号,所以在发送给客户端的时候只需要通过requestPacket.getSocketAddress()来获取客户端的IP地址和端口号。

由于服务器是固定的,所以可以直接自己去设置端口号,当服务器启动的时候端口号就被创建了。
为什么需要端口号IP地址?
要实现双方通信成功,必须要有这个四个核心指标:
源端口,源IP,目的端口,目的IP
通过这四个核心指标就可以实现双方网络通信,此处没有服务器的IP地址,是因为客户端和服务器在同一个主机上。我们可以用一个IP来表示172.0.0.1也称环回IP。
1.2.4实现一个UDP客户端
public class udpEchoClient {private DatagramSocket socket = null;private String serverIp;private int serverProt;public udpEchoClient(String serverIp, int serverProt) throws SocketException {socket = new DatagramSocket();this.serverIp = serverIp;this.serverProt = serverProt;}public void start() throws IOException {System.out.println("客户端启动!");//1.从控制台获取字符串Scanner scanner = new Scanner(System.in);while(true) {System.out.println("请输入要发送的请求: ");String request = scanner.nextLine();//2.将输入的字符串发送给服务器,还要将发送的目标确定,IP和端口号DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), 0, request.getBytes().length,InetAddress.getByName(serverIp), serverProt);socket.send(requestPacket);//3.从服务器读取到经过处理的响应DatagramPacket responsePackt = new DatagramPacket(new byte[4096], 4096);socket.receive(responsePackt);//将响应打印在控制台String response = new String(responsePackt.getData(), 0, responsePackt.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {udpEchoClient udpEchoClient = new udpEchoClient("127.0.0.1",9999);udpEchoClient.start();}
}

从控制台接收到的字符串,requestPacket对象获取到字符串对象的引用以及长度,还有自己的IP和Prot,然后通过socket的send方法发送到服务器上。

从服务器接收的响应,需要创建一个responsePackt对象,并且提前创建好一个空白的字节数组来接收从服务器接收的响应。
对一些方法区分一下:
在对方法区分前,我们需要理解字节,字符,编码形式的概念
字节与字符本质上都是二进制,就是0101这种数据,因为计算机只认识0101。
字节:字节是计算机存储数据的基本单位,1个字节就是8个bit,每个位可以是0或1,表示一个字节可以表示256个不同的值.
字符:字符是表示文本信息的基本单位,根据不同的编码形式,就会有一个字符对应多少个字节就有所不同,通过编码形式可以将字符转化为字节再通过字节来表示数据,传输数据和存储数据。
编码形式:
- ASCII码:用于表示英文字符。它使用7位来表示128个字符(包括大小写字母、数字、标点符号和一些控制字符),就是不支持中文字符,这里就是一个字符对应一个字节
- Unicode(UTF8):UTF-8是一种变长的编码形式,包括全球所有书写系统的字符,兼容ASCII字符集,并且支持中文字符,包括全球所有书写系统的字符,一个字符对应1-4字节。
- GBK:采用变长编码,主要用于中文字符编码,一个字符对应1-2字节
方法区别一下:
- getBytes():得到字节数组的引用,对象是字符,这里就是将字符转化为字节来存储数据
- getBytes().length:得到字节数组的长度,对象是字符
- getData():得到的是由字符组成的字符串的引用,对象是字节,这里就是将字节转化为字符来使用数据
- getLength():得到的字符串的长度,对象是字节
- getAddress():获取IP地址,对象是DatagramPacket
- getPort():获取Prot端口号,对象是DatagramPacket
- getSocketAddress():获取到IP地址和Prot端口号,对象是DatagramPacket
- InetAddress.getByName():这个方法可以解析主机名并返回该主机名的 IP 地址,或者直接返回给定 IP 地址的 InetAddress 对象,得到的InetAddress 对象传给服务器,服务器通过得到这个对象就可以解析出IP地址。
1.2.5实现一个UDP字典翻译服务器
这里我们可以应用继承与多态的思想来实现这个服务器,因为这个字典翻译服务器与回显服务器本质的区别就是对响应的处理,所以我们对重复的代码继承复用,扩展需要的代码即可。
public class udpDictServer extends udpEchoServer{HashMap<String,String> map = null;public udpDictServer(int port) throws SocketException {super(port);map = new HashMap<>();map.put("server","服务");map.put("client","客户端");map.put("cat","🐱");map.put("dog","🐕");map.put("pig","🐖");}@Overridepublic String process(String request) {return map.getOrDefault(request, "该词汇没有查询到");}public static void main(String[] args) throws IOException {udpDictServer udpDictServer = new udpDictServer(9999);udpDictServer.start();}
}
实现这个字典翻译,还需要数据结构中的map,利用map中的键值对来存储数据。

然后具体的业务操作就只需要重写process方法即可。

在执行到这里的时候虽然这个this指的是父类的udpEchoServer对象,但是由于udpDictServer子类继承了udpEchoServer父类有重写了process方法,由于多态的特性执行的process方法其实是子类的process方法。
2.客户端与服务器的流程
- 从控制台获取数据
- 客户端将数据发送到服务器
- 服务器接收客户端发送过来的数据
- 计算响应
- 服务器将计算好的响应发送给客户端
- 客户端接收服务器发送的响应
- 将从客户端接收服务器发送的响应打印在控制台
相关文章:
【JavaEE】网络编程——UDP
🤡🤡🤡个人主页🤡🤡🤡 🤡🤡🤡JavaEE专栏🤡🤡🤡 文章目录 1.数据报套接字(UDP)1.1特点1.2编码1.2.1DatagramSocket1.2.2DatagramPacket…...
JAVA毕业设计147—基于Java+Springboot的手机维修管理系统(源代码+数据库)
基于JavaSpringboot的手机维修管理系统(源代码数据库)147 一、系统介绍 本项目分为用户、管理员、维修员三种角色 1、用户: 注册、登录、新闻公告、售后申请、申请列表、意见反馈、个人信息、密码修改 2、管理员: 用户管理、用户管理、栏目管理、网…...
力扣第228题“汇总区间”
在本篇文章中,我们将详细解读力扣第228题“汇总区间”。通过学习本篇文章,读者将掌握如何遍历和汇总区间,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第228题“汇总区间”描…...
部署大语言模型并对话
在阿里云的https://developer.aliyun.com/adc/scenario/b105013328814fe995c0f091d708d67d 选择函数计算 设置服务器配置 复制公网地址 这个地址不能直接 在返回应用,创建应用LLM 对话页面 Open WebUI 点击下面的创建应用 部署完成后访问域名 打开访问地址...
WebSocket、socket.io-client
WebSocket WebSocket 是一种网络通信协议,它提供了一个在单个长期持久的 TCP 连接上进行全双工(full-duplex)通信的通道。 WebSocket 允许客户端和服务器之间进行双向的数据交换,这意味着服务器可以主动向客户端推送数据&#x…...
Maven 仓库
在 Maven 世界中,任何一个依赖、插件或者项目构建的输出,都可以称为 构件 。 坐标和依赖是构件在 Maven 世界中的逻辑表示方式,构件的物理表示方式是文件,Maven 通过仓库来统一管理这些文件。 任何一个构件都有一组坐标唯一标识。…...
给后台写了一个优雅的自定义风格的数据日志上报页面
highlight: atelier-cave-dark 查看后台数据日志是非常常见的场景,经常看到后台的小伙伴从服务器日志复制一段json数据字符串,然后找一个JSON工具网页打开,在线JSON格式化校验。有的时候,一些业务需要展示mqtt或者socket的实时信息展示,如果不做任何修改直接展示一串字符…...
【React Native优质开源项目】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
Android 自动更新时间的数字时钟 TextClock
TextClock 继承 TextView ,使用方法和 TextView 一样。 它专门用于显示数字时钟,可以自定义显示格式。 只要在布局文件里添加,它会自动更新时间,不需要添加刷新逻辑。 布局文件, <?xml version"1.0"…...
【Linux Git入门】Git的介绍
文章目录 前言git简介git是什么git的作用为什么要学习git安装git总结前言 在现代软件开发中,版本控制系统已经成为了不可或缺的工具。其中,Git是最受欢迎的版本控制系统之一。Git是由Linux的创造者Linus Torvalds在2005年创建的,用于管理Linux内核的开发。Git是一个分布式版…...
kafka面试题(基础-进阶-高阶)
目录 Kafka 基础篇 1.Kafka 的用途有哪些?使用场景如何? 2.Kafka 中的ISR、AR 又代表什么?ISR 的伸缩又指什么 3.Kafka 中的 HW、LEO、LSO、LW 等分别代表什么? 4.Kafka 中是怎么体现消息顺序性的? 5.Kafka 中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序…...
《系统架构设计师教程(第2版)》第11章-未来信息综合技术-07-大数据技术概述
文章目录 1. 大数据的定义2. 大数据的研究内容2.1 面临的问题2.2 面临的挑战2.3 分析步骤2.3.1 数据获取和记录2.3.2 信息抽取和清洗2.3.3 数据集成、聚集和表示2.3.4 查询处理、数据建模和分析2.3.5 解释 3.大数据的应用领域3.1 制造业的应用3.2 服务业的应用3.3 交通行业的应…...
前端面试题54(断点续传讲解)
断点续传是一种在上传或下载大文件时,如果因为网络问题中断,可以从已经上传或下载的部分继续,而不是重新开始的技术。这对于提高用户体验和节省带宽非常有帮助。下面我将分别从HTTP协议层面、前端实现思路以及一个简单的前端实现示例来讲解断…...
YOLOv10改进 | Conv篇 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)
一、本文介绍 本文给大家带来的改进机制是RCS-YOLO提出的RCS-OSA模块,其全称是"Reduced Channel Spatial Object Attention",意即"减少通道的空间对象注意力"。这个模块的主要功能是通过减少特征图的通道数量,同时关注空…...
【C++BFS】690. 员工的重要性
本文涉及知识点 CBFS算法 LeetCode690. 员工的重要性 你有一个保存员工信息的数据结构,它包含了员工唯一的 id ,重要度和直系下属的 id 。 给定一个员工数组 employees,其中: employees[i].id 是第 i 个员工的 ID。 employees[…...
视频调整帧率、分辨率+音画同步
# python data_utils/pre_video/multi_fps_crop_sync.pyimport cv2 import os from tqdm import tqdm import subprocess# 加载人脸检测模型 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml)def contains_face(frame):gray …...
【深度学习】关于模型加速
模型转为半精度的会加快推理速度吗 将模型转为半精度(通常指16位浮点数,即FP16)确实可以加快推理速度,同时还能减少显存(GPU内存)的使用。以下是一些关键点: 加快推理速度的原因 减少计算量&a…...
Python中time模块用法示例详解
前言 仅供个人学习用,如果对各位朋友有参考价值,给个赞或者收藏吧 ^_^ 一、time模块介绍 time模块是Python中处理时间相关操作的核心工具,提供了时间获取、格式化、转换、延迟以及计时等多种功能。 总的来说time模块中时间可以有3种格式&…...
解决POST请求中文乱码问题
解决POST请求中文乱码问题 1、乱码原因2、解决方法3、具体步骤 💖The Begin💖点点关注,收藏不迷路💖 在Web开发中,处理POST请求时经常遇到中文乱码问题,这主要是由于服务器在接收到POST请求的数据后&#x…...
Axure-黑马
Axure-黑马 编辑时间2024/7/12 来源:B站黑马程序员 需求其他根据:visio,墨刀 Axure介绍 Axure RP是美国Axure Software Solution给公司出品的一款快速原型大的软件,一般来说使用者会称他为Axure 应用场景 拉投资使用 给项目团…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
