文章目录
- 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();}
}
2.TCP的socket api使用
socket:既可以供服务器端使用,也可以让这个客户端使用;
server socket:这个主要就是给我们的服务器使用的,用来对于这个端口进行指定;
下面的这个方法》getlocal是获得自己的这个ip和端口号,没有带这个local的就是我们的这个对端的ip和端口号(对端就是另一端,如果这个是服务器,对端就是客户端,客户端的对端就是服务器端);
3.初识网络编程
其中这个应用层完成的工作就是明确用户的需求,明确需要进行传输的数据,然后就是把这个数组按照一定的方式进行组织,下面介绍几种常见的组织数据的格式:
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报文格式
下面的这个就是我们的计算机教材里面经常出现的一个图(计算机网络的相关的教材),但是这个图其实不便于我们对于这个报文格式有一个直观的理解,但是基本的内容还是很全面的;
下面的这个图里面,对于这个报文格式进行了进一步的说明:
首先我们的一个报文是有这个UDP报头和我们的载荷组成的,这个载荷其实就是我们传输的数据的具体内容
我们的这个UDP报头是有四个部分组成的:如下所示,其中每一个部分都是两个字节,一共是8字节的大小,和我们上面的这个图示一样的,只不过上面的是画在两行上面了;
我们的前面的两个部分是和这个端口号相关的内容:源端口号和目的端口号;
我们之前使用的源ip,目的ip不是在这个传输层,而是在我们的第三层网络层里面,但是我们现在介绍的这个是传输层的内容,因此在这个里面没有进行体现;
UDP的数据包最大就是64kb,这个也是一个缺陷
3.2.2校验和的说明
什么是校验和:校验和出现是因为我们的这个数据进行网络传输的时候可能会出现这个出现错误的情况,因此我们使用这个校验和就可以从某种程序上面去减少这个传输错误的发生,这个就是一个检查的手段(但是这个校验和并不会完全杜绝我们的错误的发生,只是会在一定的程度上对于我们在网络上面传输的数据进行检查罢了);
3.2.3校验和的计算方法
3.2.3.1CRC算法
我们的这个校验和其实是有很多的计算的方法的,此处的这个UDP使用的就是CRC算法,也叫做循环冗余算法
我们的这个就是对于这个传输前的数据和传输后的数据分别进行这个字节的累加计算。如果出现了这个传输的错误,这个计算的结果就会有出入,我们就可以进行判断;
但是这个CRC其实并不是很靠谱,因为这个计算的前后的和,如果我们传输之后,一个内容多了一个字节,一个内容少了一个字节,这个时候我们进行的这个求和计算其实是看不到这个区别的,因此这个时候这个传输的错误使用这个方法其实是检查不出来的;
3.2.3.2MD5算法
网络上面有这个直接进行转换的公式,生成器之类的,就类似于这个密码生成器,我们直接进行换算即可,我们只会介绍一下这个算法的主要的特性:
==1.定长:==就是我们的这个已知数据无论是什么样的长度,我们的这个计算之后的长度都是确定的
下面的这个就是1和我们的很长的字符串进行转换之后的这个情况,这个转换的结果显而易见,就是一样的长度;
==2.分散:==我们的这个给定字符串的绝大多数的内容都是一样的,例如两个例子:
qwertyuiop;
qwertyuiol;
上面的这两个字符串进行这个算法的转换的时候,这个转换出来的这个结果是截然不同的,虽然上面的两个字符串只有最后一个字符是不一样的;
因为这个MD5算法 的这个特性,他很适合作为我们的hash算法,因为我们的hash算法就是根据这个已知的内容进行计算,计算出来这个在数组里面的位置,然而使用我们的这个算法,即使我们的已知的内容差异很小,计算出来的这个hash值相同的概率也是很小的,这个就会降低重复的概率,进而两个内容不会放到一样的位置;
符是不一样的;
因为这个MD5算法 的这个特性,他很适合作为我们的hash算法,因为我们的hash算法就是根据这个已知的内容进行计算,计算出来这个在数组里面的位置,然而使用我们的这个算法,即使我们的已知的内容差异很小,计算出来的这个hash值相同的概率也是很小的,这个就会降低重复的概率,进而两个内容不会放到一样的位置;
3.不可逆:就是我们的字符串转换为这个格式数据很容易转换,但是我们的这个转换之后的结果想要进行反推出来我们的这个字符串,这个是相当有难度的;