关于前端:tio网络编程基础知识介绍

7次阅读

共计 2045 个字符,预计需要花费 6 分钟才能阅读完成。

一、应用层和传输层
以 http 协定为例,咱们在拜访一个网站时,浏览器会通过 TCP 协定发送如下字符串到服务器的应用层:

GET /test/abtest HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: PHPSESSID=970260278652571648

程序调试截图 (tio 的 HttpRequest.toString())

这些字符串就是应用层数据,应用层数据是依照肯定格局来组织的,这个格局就是应用层协定,譬如 http 协定。
传输层在往应用层传递数据时,并不保障每次传递的数据是一个残缺的应用层数据包(以 http 协定为例,就是并不保障应用层收到的数据刚好能够组成一个 http 包),这就是咱们常常提到的半包和粘包。传输层只负责传递 byte[]数据,应用层须要本人对 byte[]数据进行解码,以 http 协定为例,就是把 byte[]解码成 http 协定格局的字符串。
具体请参考:https://www.tiocloud.com/doc/tio/80
二、ByteBuffer
引言
ByteBuffer 是 nio/aio 编程所必须把握的一个数据结构,也是把握 tio 所必须要学会的基础知识。
构想你不懂 Map,不懂 List,不懂 Set,那么你在编程畛域将会一事无成,同样的情理,如果你不懂 ByteBuffer,你无奈在 nio/aio 编程畛域立足
初识 ByteBuffer
咱们能够把 bytebuffer 了解成如下几个属性组成的一个数据结构
byte[] bytes: 用来存储数据
int capacity: 用来示意 bytes 的容量,那么能够想像 capacity 就等于 bytes.size(),此值在初始化 bytes 后,是不可变的。
int limit: 用来示意 bytes 理论装了多少数据,能够容易想像得到 limit <= capacity,此值是可灵便变动的
int position: 用来示意在哪个地位开始往 bytes 写数据或是读数据,此值是可灵便变动的
一图感知一下 ByteBuffer

具体请参考:https://www.tiocloud.com/doc/tio/83
创立 ByteBuffer
ByteBuffer.allocate(int cap)即可创立一个指定容器大小的 ByteBuffer,见图

往 ByteBuffer 中写入数据
调用 ByteBuffer.put(byte b)即可 ByteBuffer 中写入一个字节,见图

从 ByteBuffer 读取数据
对于刚刚写好的 bytebuffer,咱们要读取它的内容,须要先设置一下 position 和 limit,否则读的地位就不对

接下来调用 ByteBuffer.get()即可读取一个字节,在读取数据的同时,ByteBuffer 的 position 也会跟关位移,见图

三、半包和粘包:正确断句能力沟通
半包
顾名思义,就是收到了半个包,这个时候不足以组成一个应用层的包。就像你要对你喜爱的人说“我喜爱你”,然而因为喝水咽着了,第一次只说了“我”字,第二次说了个“喜”字,第三个次了个“欢你”,那么就产生了半包问题,对方只有期待你说完这 4 个字后才晓得你是想说“我喜爱你”!
用 http 协定为例,展现半包场景

粘包
粘包与半包相同,就是把多个想说的话,一口气说完了,对方反馈不过去,得把你的话拆开一条一条地了解
用 http 协定为例,展现粘包场景

阐明:http 协定是一来一回的,所以失常场景是不会有粘包的,但 pipeline 模式下是容许一方间断发多个申请的,所以会有粘包产生

为何坑人有数
初涉网络编程的同学,往往认为每次收到的数据刚好是一个残缺的数据包

于是当网络不好,或是音讯包过大时,半包的状况就产生了,而程序并没有思考到半包的状况,后果就是解码失败,导致音讯失落

当通信的对方把多条业务数据包放在一个 TCP 包中发过来时,粘包就产生了,而程序没有思考到一次 TCP 收包会收到多个业务包,从而解析到第一个业务包后把前面的业务包抛弃了

百度一下半包粘包,肯定会搜到很多记录,这也证实这俩货的确坑人有数,所以看完本节内容,你还会持续犯半包粘包的错吗?
具体请参考:https://www.tiocloud.com/doc/tio/84

正文完
 0