上次,我们说过基于socket api的两种网络编程方式------UDP与TCP,重点是:
1.读写数据通过Socket,通过Socket内置的InputStream与OutputStream(读写的基本单位是字节)
2.当前在编写客户端服务器的时候,是需要约定请求/响应之间的分隔符的
3.服务器这边accept得到的socket对象,记得及时关闭
4.要处理多个客户端,需要搭配多线程/线程池
补充一下网络编程的内容。
IO多路复用
基于第四条,如果客户进一步增加,此时多线程/线程池会产生大量的线程,之前提到,线程不是越多越好,太多了反而影响进程执行效率,于是,操作系统中内置了IO多路复用------本质上就是一个线程同时负责处理多个客户端的请求。
正如三个人一起买东西吃,A想吃蛋炒饭,B想吃面,C想吃煎饼,现在有三个方案:
(1)A一个人去买饭,先买蛋炒饭,再买面,最后买煎饼(单个线程,处理多个请求,过于复杂)
(2)三个人一起出动分别买三样食物(多线程,效率提高的同时,系统开销也很大)
(3)A一个人买,先来到蛋炒饭摊那里叫老板做蛋炒饭,一会来拿,然后来到面馆,叫老板做面,一会来拿,然后去煎饼摊,重复这样的操作,等三者谁先做好,就依次拿谁的食物,只用了一份等待的时间,同时等待三个任务的完成。(多个客户端,就是多个小摊的老板,每个客户端,绝大多数时间是沉默的,工作线程只需要等待,等到客户端发来数据,线程再来处理就可以了,多个客户端同时发数据的概率较小,即使出现了这样的情况,启用其他的线程也可以)
IO多路复用是当前开发服务器的主流的核心技术,操作系统内置的,只需要调用api即可。Java也通过了NIO来封装了IO多路复用。
网络原理
网络初识中,认识网络的协议栈TCP/IP分成五层,应用层、传输层、网络层、数据链路层、物理层(这五层也是面试常考内容)。而应用层是程序员打交道最多的层次,与应用程序直接相关,程序员写的代码,只要是涉及到网络通信的,都可以视为应用层的一部分。
当然应用层中涉及到的网络通信协议,很多也是程序员自己定制的。
自定义协议的方式
具体如何自定义协议呢?
这里分成两个阶段:第一,根据需求,明确传输哪些信息;第二,约定好信息组织的格式。
1.根据需求明确传输信息

2.约定好信息组织的格式
有很多种方式。
(1)行文本的方式,但比较土,20年前的方式。

上述只是举个例子,实际约定的时候,是有很多变数的,自定义协议,你根据自己的需求来制定,只要客户端与服务器都按照这同一套规则进行构造与解析数据即可,但如果是很多人一起搞客户端与服务器,需要这些人商量好。
(2)通过xml格式来约定请求和响应的数据
同HTML一样,xml是成对的键值对结构,到时候在前端基础时会学到HTML。
xml标签的内容是可以自定义的,这一点与HTML不同。

优点是可读性好,缺点是冗余信息过多,在网络传输中,会消耗过多的带宽(服务器中最贵的部分,价格高于CPU)。
(3)json(当下最流行的网络数据格式组织的方案)
他用另外一种简便的方式表示了键值对。

优点是可读性好,且消耗的带宽比xml更少,缺点是仍然存在冗余信息。
(4)protobuf
基于二进制的格式对数据进行压缩,不涉及到冗余信息了,但带宽消耗最少的同时,可读性也变差了,因为二进制文件我们也看不懂。在性能要求高的场景就需要使用,如果性能要求不高,还是更建议使用json。

综上来做个总结:

HTTP协议(重点)

应用层这里,除了自定义协议之外,也有大佬们搞好的协议了,http协议就是其中一种,http协议是当前web开发中最核心的协议,使用网站,都会用到http,即使在招聘要求上,都会看到很多公司明确给出对这个的熟练掌握,与数据结构与算法一样,工作后也需要。Spring就是围绕http展开的。
这里的https就是在http的基础上加了一个安全层。
HTTP是一问一答模式的协议,即客户端发一个请求,服务器就返回一个响应,请求和响应是一一对应的。
正如浏览器打开网页的场景或手机app加载数据的场景,就是典型的一问一答场景。

抓包工具
抓包工具能够获取到网络的数据包,将详细的格式解析出来。
抓包工具就相当于代理。

在你电脑上所有的网络通信,都会先发给这个抓包程序,抓包程序再把数据转发给服务器。
fiddler(专门抓HTTP的抓包工具)

官网上下载不了,那么推荐到搜狗下载那里下载,不然弹出什么广告什么的就很麻烦了。
下载好安装了之后:

当你成功进来了之后,进行一些操作时,比如从百度上搜索东西,点一下这些按钮


点击左页面的内容,你就会看到右图的信息(快捷键crtl+a选中所有,自己可以删除)

点这个是将二进制的内容进行解析。

后续要学习的就是这些内容都表达什么意思。
最后看一下我的页面吧,我先点击左边的蓝色部分,再点的inspector,然后点的两个Raw。
