【JavaEE】——自定义协议方案、UDP协议

ops/2024/10/22 1:35:40/

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:自定义协议

1:自定义协议

(1)交互哪些信息

(2)数据的具体格式

2:(反)序列化

3:业界方案

二:xml方案

1:优点

2:缺点

三:json方案

1:结构

2:优点

四:protobuffer方案

五:传输层

六:UDP协议

1:特点

七:校验和/检验和

1:比特翻转

2:数据参与

3:CRC算法

4:md5算法特点


一:自定义协议

程序员在调用操作系统提供的网络API写出来的代码都是属于应用层的(回顾五个层级:应用层,传输层,网络层,数据链路层,物理层),应用层自身就有许多已经创建好的协议,但多数情况下是需要程序员自定义协议的

1:自定义协议

主要约定好两方面的内容

(1)交互哪些信息

解释:服务器和客户端之间要交互哪些信息,由产品经理规定需要传输哪些信息

(2)数据的具体格式

解释:客户端按照约定构造、发送请求,解析返回的响应

           服务器按照约定解析请求,构造、发送响应

2:(反)序列化

Client和Server之间交互的是“结构化数据”,网络传输的数据其实是“字符串”“二进制bit流”,约定协议的过程就是把“结构化数据”转化为“二进制bit流”的过程

结构化数据———转化———>字符串/二进制bit流       叫做“序列化”

字符串/二进制bit流———还原———>结构化数据        叫做“反序列化”

3:业界方案

为了让程序员更方便的约定这里的协议格式,给出了几个可以直接套用的方案

二:xml方案

1:优点

(1)可读性好:标签的名字能够对数据起到描述作用

(2)延展性好:后续增加属性,只需新增标签,不影响原有代码

2:缺点

整个数据冗余信息非常多,标签占据的空间可能反而比数据本身更多了,在网络传输中会消耗更多的网络带宽(网络带宽这种硬件资源很贵)

三:json方案

1:结构

键值对结构

键和值用   : 分开

键值之间用     ,    分开 

多个键值对用{}括起来,构成一个json对象

多个json对象用   ,   分开  整体用[]括起来形成一个json数组

2:优点

(1)可读性好

key对数据起到解释说明

(2)占用空间更小

相比较于xml中需要开始和结束两个标签,json只用了一个key,更节省网络带宽(这里的节省是相对的,json中的key也会被多次创建)

(3)延展性好

四:protobuffer方案

开发阶段(写代码)定义出有哪些资源,描述每个字段的含义,真正运行的时候,实际传输的数据是不包含这样的描述信息

优点:程序的运行效率高

缺点:不利于程序猿阅读

所以只有那些对性能要求非常高的场景才会使用protobuffer

五:传输层

在数据传输过程中,虽然传输层是操作系统内核中已经实现好的,但是我们也需要重点关注,我们使用的socket的API都是由传输层提供的

对于端口号,它是一个2字节的整数(0,2的16次方-1),在使用端口号的时候,[1,1024]都是属于系统保留的自用的端口号(知名端口号)

六:UDP协议

1:特点

回顾一下:无连接,不可靠传输,面向数据报,全双工,

UDP数据报=报头+载荷

UDP报头中4个字段,每个字段2个字节,共8个字节

协议中报头用2个字节表示端口号,能表示的范围为2^16-1=65535,即[0,65535],

换算一下为64KB——即UDP数据报最大长度为64KB,载荷部分应该是64KB-8

七:校验和/检验和

1:比特翻转

验证数据在传输过程中是否正确,数据在网络传输中可能会坏掉,网络传输本质是发送方的物理层把二进制数据转化为光电信号发送出去。再由另一端的物理层接收光电信号在转化为二进制数据,在这个过程中,很有可能由于外界信号的干扰,发生“1->0”“0->1”这样的翻转情况,导致我们的数据出现问题,校验和的作用就是用来识别数据是否出现比特翻转的。

2:数据参与

校验和是拿着原始信息的一部分内容参与计算的,例如把这样一段字符串“张三今天想吃麻辣烫”传输,在传输之前会把字符串通过某种运算转化成例如“AD343SCSCAF2321”这样的密码串,校验的时候,再运算一次,(在运算转化的过程中,数据可能会超出范围,不打紧)通过比较两次运算的结果可以知道,该次数据传输是否是一致的正确的

3:CRC算法

4:md5算法特点

(1)定长

无论原始数据有多长,算出来的md5最终值都是固定长度

(2)分散

计算md5的过程中,原始数据只要变化一点点,最后得到的md5值就会差异很大

(3)不可逆

给定一个md5的值还原为原始的字符串,理论来说不可行,因为在字符串转化为md5的过程中,已经有很多数据丢失了,特点(1),有兴趣的友友可以在浏览器上搜一下(有点像加密——密码学)


http://www.ppmy.cn/ops/127438.html

相关文章

C#中判断的应用说明二(switch语句)

一.判断的定义说明 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的一般形式: 二.判…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

MySQL索引、事物与存储引擎

目录 一、MySQL索引 1.索引的概念 2.索引的作用 3.创建索引的原则依据 4.索引的分类和创建 4.1 普通索引 4.2 唯一索引 4.3 主键索引 4.4 组合索引&#xff08;单列索引与多列索引&#xff09; 4.5 全文索引&#xff08;FULLTEXT&#xff09; 5. 查看索引 6.删除索引…

matlab怎样将数据按行拼接和按列拼接(水平拼接竖直拼接)

1-将两个矩阵水平拼接 在 MATLAB 中&#xff0c;A [A, B] 是将矩阵 A 和矩阵 B 进行水平拼接的操作。具体来说&#xff0c;它是将矩阵 B 按照列的方式拼接到矩阵 A 的右边。 2-将两个矩阵竖直拼接 在 MATLAB 中&#xff0c;A [A&#xff1b; B] 是将矩阵 A 和矩阵 B 进行竖…

FPGA驱动HDMI 初级篇

简介 本章节主要讲述如何通过FPGA驱动HDMI显示。 本章节框图如下: bd框图中使用了两个IP核,分别是Video Timing controller核AXI4-Stream to video out两个模块,下面先对两个模块做介绍。 Video Timing controller 配置如下: 这里由于没有使用ZYNQ PS端,…

隐藏移动端IOS和安卓上的滚动条

直接上代码&#xff0c;就几行 ::-webkit-scrollbar {/* 不显示出来&#xff0c;安卓上会自动补上滚动条 */display: block;/* 宽度为0&#xff0c;安卓上会自动补上滚动条 */width: .5px; }::-webkit-scrollbar-thumb {/* 让看不见但是存在 */background-color: transparent;…

机器视觉系统硬件组成之工业相机篇

工业相机是一种非常重要的机器视觉器件&#xff0c;它能够将被采集的图像信息通过电路转换成电信号&#xff0c;再通过模数转换器&#xff08;ADC&#xff09;将其转化为数字信号&#xff0c;最后以标准的视频信号输出。工业相机在机器视觉领域得到了广泛应用&#xff0c;包括质…

Linux系统:配置Apache支持CGI(Ubuntu)

配置Apache支持CGI 根据以下步骤配置&#xff0c;实现Apache支持CGI 安装Apache&#xff1a; 可参照文章&#xff1a; Ubuntu安装Apache教程。执行以下命令&#xff0c;修改Apache2配置文件000-default.conf&#xff1a; sudo vim /etc/apache2/sites-enabled/000-default.con…