JavaEE初阶------网络编程续+传输层UDP协议介绍

文章目录

  • 1.实现翻译服务器
  • 2.TCP的socket api使用
  • 3.初识网络编程
    • 3.1开发中常见的格式
      • 3.1.1行文本方式构造
      • 3.1.2xml格式表示
      • 3.1.3json处理格式
      • 3.1.4protobuffer格式
    • 3.2传输层
      • 3.2.1UDP报文格式
      • 3.2.2校验和的说明
      • 3.2.3校验和的计算方法
        • 3.2.3.1CRC算法
        • 3.2.3.2MD5算法

1.实现翻译服务器

例如我们的请求是一个cat,这个时候的响应就是这个单词的中文意思,这个就是一个简单的翻译服务器,这个和我们之前实现的回显服务器,就有所逻辑了;

下面的这个就是构建一个子类:继承了这个UdpEchoServer这个类,对于这个里面的process方法进行重写,因为我们这个里面是需要对于这个输入的内容进行操作的,而不是像回显服务器一样直接返回用户的输入,而是需要进行处理的;

import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;public class UdpDictServer extends UdpEchoServer{private Map<String,String> dict = new HashMap<>();public UdpDictServer(int port) throws SocketException {super(port);//可以往这个表里面插入很多的这个单词dict.put("cat","小猫");dict.put("dog","小狗");dict.put("pig","小猪");}@Overridepublic String process(String request) {return dict.getOrDefault(request,"您要找的这个单词在我们的这个字典里面不存在");}public static void main(String[] args) throws IOException {UdpDictServer server = new UdpDictServer(9090);server.start();}
}

image-20241028201952199

2.TCP的socket api使用

socket:既可以供服务器端使用,也可以让这个客户端使用;

server socket:这个主要就是给我们的服务器使用的,用来对于这个端口进行指定;

下面的这个方法》getlocal是获得自己的这个ip和端口号,没有带这个local的就是我们的这个对端的ip和端口号(对端就是另一端,如果这个是服务器,对端就是客户端,客户端的对端就是服务器端);

image-20241029092025788

image-20241029105728511

image-20241029105749249

image-20241029105633524

3.初识网络编程

image-20241029114052813

其中这个应用层完成的工作就是明确用户的需求,明确需要进行传输的数据,然后就是把这个数组按照一定的方式进行组织,下面介绍几种常见的组织数据的格式:

3.1开发中常见的格式

3.1.1行文本方式构造

例如我们的这个点餐平台上面的这个例子:

我们的请求就是想要知道这个用户的信息和位置信息;

响应就应该给我们返回这个商家的信息:商家的列表,名称,图片,距离,简介,评分等等,我们一般的这个点餐,外卖的平台上面都是这样的格式,我这个地方只是进行了这个相应的信息的简化,实际上的这个信息远比我写的会更加复杂;

3.1.2xml格式表示

这个的这个写法其实和我们的HTML貌似有些关系,那么你猜对了,这个HTML就是我们的这个xml里面的一个形式罢了,我们的这个xml远比我们学习过的这个HTML会更加复杂,但是两者既然是有关系的,那么在这个语法上面肯定是存在一定的相似性的;

我们的这个xml也是使用的这个标签对于这个数据进行组织;

xml的优势:数据的可读性会变得更好;

xml的劣势:标签的撰写十分繁琐,传输的时候需要对于这个带宽有额外的消耗;

3.1.3json处理格式

这个是当下十分流行的一个对于数据的组织的格式,这个格式后面还会反复得用到;

这个是使用的这个类似以键值对的方式进行表示的:

{userid:1234;position:"100.20";}

上面这个就是一个简单的表示,其实这个就是有这个大括号括起来,然后使用这个键值对表示这个里面的每一组数据,我们的这个key就是string类型的,但是我们的这个value可以是数字或者是这个字符串数组之类的都是允许的

优势:可读性比较好,比上面的这个xml会更加简洁;

劣势:因为是使用的这个键值对进行传递的,因此这个就可能会消耗额外的带宽;

3.1.4protobuffer格式

这个就是把我们需要进行传输的数据使用二进制的形式进行压缩,减少这个传输过程中的这个带宽的占有量;

劣势:可读性不好,因为这个是使用二进制的格式进行表示的,因此这个可读性会降低我们进行开发的效率;

优势:占用的带宽会降低,传输的效率非常高,如果我们对于这个传输的性能很高,可以考虑这个数据传输的方式;

3.2传输层

我们的这个传输层就主要是这个UDP/TCP协议,今天学习的这个UDP协议的相关内容;

3.2.1UDP报文格式

下面的这个就是我们的计算机教材里面经常出现的一个图(计算机网络的相关的教材),但是这个图其实不便于我们对于这个报文格式有一个直观的理解,但是基本的内容还是很全面的;

image-20241029163027896

下面的这个图里面,对于这个报文格式进行了进一步的说明:

首先我们的一个报文是有这个UDP报头和我们的载荷组成的,这个载荷其实就是我们传输的数据的具体内容

我们的这个UDP报头是有四个部分组成的:如下所示,其中每一个部分都是两个字节,一共是8字节的大小,和我们上面的这个图示一样的,只不过上面的是画在两行上面了;

image-20241029163252195

我们的前面的两个部分是和这个端口号相关的内容:源端口号和目的端口号;

我们之前使用的源ip,目的ip不是在这个传输层,而是在我们的第三层网络层里面,但是我们现在介绍的这个是传输层的内容,因此在这个里面没有进行体现;

UDP的数据包最大就是64kb,这个也是一个缺陷

3.2.2校验和的说明

什么是校验和:校验和出现是因为我们的这个数据进行网络传输的时候可能会出现这个出现错误的情况,因此我们使用这个校验和就可以从某种程序上面去减少这个传输错误的发生,这个就是一个检查的手段(但是这个校验和并不会完全杜绝我们的错误的发生,只是会在一定的程度上对于我们在网络上面传输的数据进行检查罢了);

3.2.3校验和的计算方法

3.2.3.1CRC算法

我们的这个校验和其实是有很多的计算的方法的,此处的这个UDP使用的就是CRC算法,也叫做循环冗余算法

我们的这个就是对于这个传输前的数据和传输后的数据分别进行这个字节的累加计算。如果出现了这个传输的错误,这个计算的结果就会有出入,我们就可以进行判断;

但是这个CRC其实并不是很靠谱,因为这个计算的前后的和,如果我们传输之后,一个内容多了一个字节,一个内容少了一个字节,这个时候我们进行的这个求和计算其实是看不到这个区别的,因此这个时候这个传输的错误使用这个方法其实是检查不出来的;

3.2.3.2MD5算法

网络上面有这个直接进行转换的公式,生成器之类的,就类似于这个密码生成器,我们直接进行换算即可,我们只会介绍一下这个算法的主要的特性:

==1.定长:==就是我们的这个已知数据无论是什么样的长度,我们的这个计算之后的长度都是确定的

下面的这个就是1和我们的很长的字符串进行转换之后的这个情况,这个转换的结果显而易见,就是一样的长度;

image-20241029164618864

==2.分散:==我们的这个给定字符串的绝大多数的内容都是一样的,例如两个例子:

qwertyuiop;

qwertyuiol;

上面的这两个字符串进行这个算法的转换的时候,这个转换出来的这个结果是截然不同的,虽然上面的两个字符串只有最后一个字符是不一样的;

因为这个MD5算法 的这个特性,他很适合作为我们的hash算法,因为我们的hash算法就是根据这个已知的内容进行计算,计算出来这个在数组里面的位置,然而使用我们的这个算法,即使我们的已知的内容差异很小,计算出来的这个hash值相同的概率也是很小的,这个就会降低重复的概率,进而两个内容不会放到一样的位置;

符是不一样的;

因为这个MD5算法 的这个特性,他很适合作为我们的hash算法,因为我们的hash算法就是根据这个已知的内容进行计算,计算出来这个在数组里面的位置,然而使用我们的这个算法,即使我们的已知的内容差异很小,计算出来的这个hash值相同的概率也是很小的,这个就会降低重复的概率,进而两个内容不会放到一样的位置;

3.不可逆:就是我们的字符串转换为这个格式数据很容易转换,但是我们的这个转换之后的结果想要进行反推出来我们的这个字符串,这个是相当有难度的;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/394.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python的数据结构列表方法及扩展(栈和队列)

python的数据结构 python的list方法 list.append() 添加一个元素到列表末尾。list,append(num)相当于a[len(a):] [num] a [1,2,3,4,5] a.append(6) print(a) a[len(a):] [7] print(a)list.extend() 添加指定列表的所有元素。list.extend(nums)相当于a a nums a [1,2,3]…

我与Linux的爱恋:基础IO 文件描述符重定向缓冲区

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 文件描述符文件描述符分配规则访问文件的本质 重定向原理缓冲区的理解 文件描述符 通过上述内容&#xff0c;我们知道使用 open 系统调用打开文件时&#xff0c;系…

Java每日刷题之二分算法

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 转化 通过题目时间复杂度为O(logN),我们就可以联想到二分算法&#xff0c;但是我们前面学到的算法&#xff0c;是查找出&#xff0c;有序数组里的值&#xff0c;并不是求其中的范围&a…

qt QBrush详解

1、概述 QBrush是Qt框架中的一个基本图形对象类&#xff0c;它主要用于定义图形的填充模式。QBrush可以用于填充如矩形、椭圆形、多边形等形状&#xff0c;也可以用于绘制背景等。通过QBrush&#xff0c;可以设置填充的颜色、样式&#xff08;如实心、渐变、纹理等&#xff09…

postman如何安装旧版本不升级(以9.31和11.10版本为例)

postman版本超过10.x&#xff08;包含10.x)&#xff0c;有个大的麻烦&#xff0c;就是需要登录账号&#xff0c;如果网络不佳&#xff08;其实是外网受限&#xff09;,那就很难受了 功能页面都进不去了&#xff01;而8.x /9.x等以下版本就不需要登录了。 比如9.31.30这个版本就…

线程函数和线程启动的几种不同形式

线程函数和线程启动的几种不同形式 在C中&#xff0c;线程函数和线程启动可以通过多种形式实现。以下是几种常见的形式&#xff0c;并附有相应的示例代码。 1. 使用函数指针启动线程 最基本的方式是使用函数指针来启动线程。 示例代码&#xff1a; #include <iostream&g…

Arm和高通闹翻在即,或影响骁龙 8 Elite

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; Arm向高通下达最后通牒&#xff0c;骁龙 8 Elite或受影响 其实对于小江这个不咋关注安卓圈的用户来说&#xff0c;高通和Arm大概就是秤不离砣&#xff0c;砣不离秤的关系。不过在看了今天的最新…

【学术精选】SCI期刊《Electronics》特刊“New Challenges in Remote Sensing Image Processing“

英文名称&#xff1a;New Challenges in Remote Sensing Image Processing 中文名称&#xff1a;"遥感图像处理的新挑战"特刊 期刊介绍 “New Challenges in Remote Sensing Image Processing”特刊隶属于《Electronics》期刊&#xff0c;聚焦遥感图像处理领域快速…

人机环境系统智能是东方天地人思想与西方科技思维的融合

西方科技思维常常受到还原主义的影响&#xff0c;这种思维方式通常强调将复杂系统拆解为更简单的部分进行分析&#xff08;比如物理的分子、原子、电子、夸克……&#xff0c;数理中的分解因式&#xff09;。以下是还原主义的一些特点&#xff1a; 分析方法&#xff1a;强调通过…

深度学习:梯度下降算法简介

梯度下降算法简介 梯度下降算法 我们思考这样一个问题&#xff0c;现在需要用一条直线来回归拟合这三个点&#xff0c;直线的方程是 y w ^ x b y \hat{w}x b yw^xb&#xff0c;我们假设斜率 w ^ \hat{w} w^是已知的&#xff0c;现在想要找到一个最好的截距 b b b。 一条…

瑞芯微RK3566/RK3568 Android11下该如何默认屏蔽导航栏/状态栏?看这篇文章就懂了

本文介绍瑞芯微RK3566/RK3568在Android11系统下&#xff0c;默认屏蔽导航栏/状态栏方法&#xff0c;使用触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566芯片&#xff0c;类树莓派设计&#xff0c;Laval官方社区主荐&#xff0c;已适配全新OpenHarmony5.0 R…

Python | Leetcode Python题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, m: int, n: int):self.m mself.n nself.total m * nself.map {}def flip(self) -> List[int]:x random.randint(0, self.total - 1)self.total - 1# 查找位置 x 对应的映射idx self.map.get(x,…

从0学习React(6)

这两天在写IT资产管理的时候&#xff0c;对于前端&#xff0c;我一直没有任何头绪&#xff0c;不知道怎么写。因为我之前并没有学习过前端方面的知识&#xff0c;我学的都是后端。我在写后端接口的时候&#xff0c;我是自己有一些基础的&#xff0c;然后我又参照着模仿着一些很…

单个相机矫正畸变

1、通过标定助手获取到内参外参&#xff0c;外参在此无效&#xff0c;只用到了内参 2、然后通过halcon算子进行矫正 参考&#xff1a;超人视觉

乘云而上,OceanBase再越山峰

一座山峰都是一个挑战&#xff0c;每一次攀登都是一次超越。 商业数据库时代&#xff0c;面对国外数据库巨头这座大山&#xff0c;实现市场突破一直都是中国数据库产业多年夙愿&#xff0c;而OceanBase在金融核心系统等领域的攻坚克难&#xff0c;为产业突破交出一副令人信服的…

laravel: Breeze 和 Blade, 登录 注册等

composer require laravel/breeze --dev php artisan breeze:install php artisan migrate npm install npm run build php artisan route:clear http://laravel-dev.cn/ http://laravel-dev.cn/register http://laravel-dev.cn/login

VS+Qt解决提升控件后,包含头文件格式不对问题处理

一、前言 VSQt 提升控件后&#xff0c;在uic目录下会生成ui相关的初始化文件&#xff0c;对于提升的控件头文件包含的格式为#include<> 而非 #include “ ” 导致无法找到头文件。如果手动修改为 #include “ ”相当麻烦&#xff0c;甚至每次编译都要修改一遍&#xff0c…

一些硬件知识【2024/11/3】

MLCC电容的ESR比较小&#xff0c;但是他的缺点是容量通常比较低&#xff1b;电解电容的容量比较大&#xff0c;但是他的ESR比较大&#xff1b;而钽电容介于两者之间&#xff0c;是MLCC找不到合适的容值比较大的时候&#xff0c;找钽电容&#xff1a; LC谐振电路&#xff1a; 五…

简单的ELK部署学习

简单的ELK部署学习 1. 需求 我们公司现在使用的是ELK日志跟踪&#xff0c;在出现问题的时候&#xff0c;我们可以快速定为到问题&#xff0c;并且可以对日志进行分类检索&#xff0c;比如对服务名称&#xff0c;ip , 级别等信息进行分类检索。此文章为本人学习了解我们公司的…

SpringBoot篇(自动装配原理)

目录 一、自动装配机制 1. 简介 2. 自动装配主要依靠三个核心的关键技术 3. run()方法加载启动类 4. 注解SpringBootApplication包含了多个注解 4.1 SpringBootConfiguration 4.2 ComponentScan 4.3 EnableAutoConfiguration 5. SpringBootApplication一共做了三件事 …