一、网络编程的原理就是使用 socket api 来编写程序
- UDP 协议使用 DatagramSocket 和 DatagramPacket 两个接口来编写程序,UDP 协议是无连接 ,字节流传输的 。在使用 UDP 协议来编写程序,就是使用数据报 来编写程序,把我们客户端的请求和服务器的响应都打包成数据报进行传输 。而且它还是不安全的传输 ,他不能知道数据报到底到达对方那里了没有,它只管把这个数据报给丢出去,能否到达他并不关心。
- TCP 协议使用 ServerSocket 和 Socket两个接口来编写程序
- 数据在读写的时候通过 Socket 内置的 InputStream 和 OutputStream 这两个流对象。读写的基本单位还是字节 ,所以完成字符流读取是需要我们规定 请求/响应 之间的分隔符。(默认\n)
- 服务器这边的 ServerSocket 需要调用 accept 这个方法,得到 Socket 对象,这个对象在每次创建连接的时候创建,在连接结束的时候需要我们手动销毁
- 要处理多个客户端的时候,可以搭配多线程和线程池来搭配
二、多路复用
如果客户端进一步增加,此时多线程/线程池 ,就会产生出大量的线程 ,此时性能也会降低很多。这时候操作系统中内置了 IO 多路复用,本质上就是一个线程同时处理多个客户端的请求。
就像是在小吃街我去买饭 ,需要买三份饭, 我可以先去第一家店铺 点好我的饭,然后和老板说我等下来 ,接下来直接去下一家店 ,再和老板说等下来拿 ,最后去最后一家店也是和老板说等下来拿饭 。然后我就处理了这三个买饭的工作 ,接下来我只需要等哪个老板把饭做好了,喊我去拿的时候去拿就行了 。这样我一个人就可以同时让三个老板同时工作,并且哪个老板完成之后喊我,我再过去接收响应。
这样的办法就叫做多路复用。
三、自定义协议
自定义协议有两个阶段:
1.根据需求,我需要传输哪些信息。
就像是外卖软件,我需要给前端返回一个商家列表,这时候我们和前端约定好数据这样传输
客户端-服务器-传递的信息
请求: 用户的位置信息,用户的id
响应: 商家的id,商家的名字,商家图片,评分,配送费,种类...
2.约定好信息组织的格式
有很多种方式
1) 行文本的格式,一行为一个数据

商家id,商家名字,商家图片,商家评分,配送费用,分类\n
商家id,商家名字,商家图片,商家评分,配送费用,分类\n
商家id,商家名字,商家图片,商家评分,配送费用,分类\n
\n // 空白行
2) 通过 xml 格式来约定 请求和响应 的数据
关于 heml 和 xml 都是成对的标签构成的键值对结构 ,因为 html 标签内容是固定好的,但是 xml 的标签内容是自定义的 ,所以 html 的灵活性比 xml 的灵活性要差(现在的 html 5 允许自定义标签了),所以我们使用 xml 来表示数据。

优点:可读性好
缺点:冗余的信息很多,会消耗更多的网络带宽,在网络传输中,最贵的就是网络带宽。
对于服务器来说: 带宽 > cpu > 内存 > 硬盘
3) json 当下流行的网络数据格式组织的方案

优点是:可读性强,消耗的带宽也比上面的 xml 少很多
缺点是:还存在一些冗余信息
4) protobuf 网络数据格式组织方案
它是基于二进制的格式来对数据进行压缩,这时候因为是二进制,所以不涉及到 json/xml 的冗余信息,我们只需要规定好那几个字节表示什么数据就好了,这时候带宽消耗最少,但是可读性是最差的。
网络数据格式组织方案小结:
1)行文本(最原始)
2)xml (比较原始,可读性好,冗余比较多)
3)json (当前主流的方式,可读性好,比起 xml 冗余降低很多)
4)protobuf (高性能场景下使用,可读性差,冗余最少)
四、关于网络通信的模型
- 一问一答 模式
客户端发一个请求,服务器就返回一个响应,请求和响应一一对应 - 多问一答
在上传大文件的时候,客户端把文件拆成多个部分,分别上传,当服务器接收成功之后返回一个响应 - 一问多答
在下载大文件的时候,我们客户端向服务器发起下载请求,我们服务器把这个大的文件分成多个小文件分别传输给客户端,这时候我们客户端一次请求就能得到服务器的多个响应。 - 多问多答
就像远程控制对方电脑的时候,对方要传过来画面,我们接收画面,我们也需要发送请求,对方也需要发送请求,我们远程不只可以操作一个,也可以操作多个,这时候请求和响应就有多个了。
http是一问一答的模式的协议。
我们浏览器打开网页的场景 /手机app加载数据的场景,是典型的一问一答的场景 ,这时候使用 http 协议就非常合适。
五、关于正向代理和反向代理
我要去超市买东西,我可以让我朋友去给我买 ,我把买东西这个请求给我朋友 ,我朋友 接收这个请求之后去给超市老板 执行这个请求 ,这时候 "朋友" 就是正向代理 。
这时候如果老板雇员工 ,我朋友 去给员工 说我要买的东西,员工 不知道位置,去和老板 说,老板 去告诉她 位置,员工 得到位置去拿东西给我朋友 ,我朋友 最后把东西给我 。这时候这个员工就是反向代理。
总的来说,这个代理的角度是从客户端的角度来分析的,客户端找的代理就是正向代理,服务器找的代理就是反向代理。

六、关于抓包
抓包就是我们客户端找的代理,让这个代理知道并参与我们整个流程,这时候我们就可以通过这个代理来看这个流程到底做了什么工作。