t-io网络编程基础知识介绍

爱写码 等级 543 0 0

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

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()) t-io网络编程基础知识介绍 这些字符串就是应用层数据,应用层数据是按照一定格式来组织的,这个格式就是应用层协议,譬如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 t-io网络编程基础知识介绍 具体请参考:https://www.tiocloud.com/doc/tio/83 创建ByteBuffer ByteBuffer.allocate(int cap)即可创建一个指定容器大小的ByteBuffer,见图 t-io网络编程基础知识介绍 往ByteBuffer中写入数据 调用ByteBuffer.put(byte b)即可ByteBuffer中写入一个字节,见图 t-io网络编程基础知识介绍 从ByteBuffer读取数据 对于刚刚写好的bytebuffer,我们要读取它的内容,需要先设置一下position和limit,否则读的位置就不对 t-io网络编程基础知识介绍 接下来调用ByteBuffer.get()即可读取一个字节,在读取数据的同时,ByteBuffer的position也会跟关位移,见图 t-io网络编程基础知识介绍 三、半包和粘包:正确断句才能沟通 半包 顾名思义,就是收到了半个包,这个时候不足以组成一个应用层的包。就像你要对你喜欢的人说“我喜欢你”,但是因为喝水咽着了,第一次只说了“我”字,第二次说了个“喜”字,第三个次了个“欢你”,那么就发生了半包问题,对方只有等待你说完这4个字后才知道你是想说“我喜欢你”! 用http协议为例,展示半包场景 t-io网络编程基础知识介绍 粘包 粘包与半包相反,就是把多个想说的话,一口气说完了,对方反应不过来,得把你的话拆开一条一条地理解

用http协议为例,展示粘包场景 t-io网络编程基础知识介绍 说明:http协议是一来一回的,所以正常场景是不会有粘包的,但pipeline模式下是允许一方连续发多个请求的,所以会有粘包产生

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

于是当网络不好,或是消息包过大时,半包的情况就发生了,而程序并没有考虑到半包的情况,结果就是解码失败,导致消息丢失

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

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

收藏
评论区

相关推荐

C# 代码片段
**一、List<byte>和byte\[\] 转换** **方法1:** Byte[] bytes;     // 复制源 List<Byte> lbyte = new List<Byte>;  // 复制目的 **方法2:** // 迭代 bytes 数组中的内容后添加到 lbyte 中 foreach(
go学习笔记
标准库 名称 摘要 archive tar tar包实现了tar格式压缩文件的存取. zip zip包提供了zip档案文件的读写服务. bufio bufio 包实现了带缓存的I/O操作. builtin builtin 包为G
Java Nio
(1)NIO a)  Nio之所以比旧的io速度快是因为,nio使用的结构更接近于系统操作执行io的操作:通道和缓冲器. (2)如何操作nio读写数据 Nio读写方式可以想象成:数据源和数据目的地是煤矿与煤场,通道想象成告诉公路,缓冲器是卡车,nio中的FileChannel是装卸煤用的工具,ByteBuffer是装煤用的卡车.在新的io中我们不对通道
java.nio.ByteBuffer源码解读
版本:JDK7 package java.nio; public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer> { // These fields are declared here rather than in Heap-X-Buffer
java输入输出
一、简介 ---- java NIO相关类在jdk1.4被引入,用于提高I/O的效率。java NIO包含很多东西,但核心的东西不外乎Buffer、channel和selector。本文先来看Buffer的实现。 二、继承体系 ------ Buffer 的继承类比较多,用于存储各种类型的数据。包括 ByteBuffer、CharBuffer、In
10万级内存交易撮合系统
mxs-exchange ============ #### 介绍 mxs-exchange 是10万级内存交易撮合系统。基于[OpenHFT Chronicle-Bytes](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2FOpenHFT%2FChronicl
Netty
Netty - ByteBuf =============== 1.1 原生的ByteBuffer ----------------- Java NIO的ByteBuffer被称为字节缓冲区。此类针对字节缓冲区定义了以下六类操作: 1. 读写单个字节的绝对和相对 get 和 put 方法; 2. 将此缓冲区的连续字节序列传输到数组中的相对批量 ge
C# byte[] 转换hex(16进制字符串)
**1.byte\[\] 转换hex(16进制字符串)**    1.1 BitConverter方式 var str = DateTime.Now.ToString(); var encode = Encoding.UTF8; var bytes = encode.GetBytes
CentOS “Destination Host Unreachable”问题解决办法
挑战极速安装CentOS时遇到局域网主机不能通信的情况: [root@zjd network-scripts]# ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=40 time=28.0 m
Go正则提取html A 连接标签
import ( "bufio" "bytes" "fmt" "io/ioutil" "net/http" "os" "regexp" "strconv" "strings" ) func ListHref(html string) {
Netty之缓冲区ByteBuf解读(一)
![](https://oscimg.oschina.net/oscnet/up-6de4d71f462d9846befe00ec6505125a928.JPEG) \> Netty 在数据传输过程中,会使用缓冲区设计来提高传输效率。虽然,Java 在 NIO 编程中已提供 ByteBuffer 类进行使用,但是在使用过程中,其编码方式相对来说不太友好,也
Python bytes 反斜杠转义问题解决方法
一、问题 ---- 因为[前文](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwonzwang.blog.csdn.net%2Farticle%2Fdetails%2F111600846)提到工作中需要使用 Go 调 Python 脚本执行加解密,但是 Go 那边执行命令行输出的是 s
Redis相关配置
1、计量单位,大小写不敏感,配置redis内存。 # Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: # # 1k => 1000 by
Redis配置文件详解
点击上方**蓝色字体**,选择“**置顶或者星标**” 优质文章第一时间送达! * * * Redis.config详解 -------------- 启动的时候通过配置文件来启动(windows 10 下的redis配置文件, 类同Linux) 单位 -- `# 1k => 1000 bytes # 1kb => 1024 byt
Redkale 技术详解 03
[Convert](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fredkale.org%2Fconvert.html)是个重复造轮子的组件,却是个飞速的轮子。Redkale之所以重复造轮子主要追求性能和需要与网络数据的序列化很好的结合([Convert与ByteBuffer的结合](ht