3、Opcode: 4bit
- %x0:表示一个延续帧 。当 Opcode 为 0 时,表示本次数据传输采用了数据分片,当前收到的数据帧为其中一个数据分片;
- %x1:表示这是一个文本帧(text frame);
- %x2:表示这是一个二进制帧(binary frame);
- %x3-7:保留的操作代码,用于后续定义的非控制帧;
- %x8:表示连接断开;
- %x9:表示这是一个心跳请求(ping);
- %xA:表示这是一个心跳响应(pong);
- %xB-F:保留的操作代码,用于后续定义的控制帧 。
表示是否要对数据载荷进行掩码异或操作 。
0:否
1:是
5、Payload length: 7bit or (7 + 16)bit or (7 + 64)bit
表示数据载荷的长度
- 0~126:数据的长度等于该值;
- 126:后续 2 个字节代表一个 16 位的无符号整数,该无符号整数的值为数据的长度;
- 127:后续 8 个字节代表一个 64 位的无符号整数(最高位为 0),该无符号整数的值为数据的长度 。
- 当 Mask 为 1,则携带了 4 字节的 Masking-key;
- 当 Mask 为 0,则没有 Masking-key 。
注意:掩码的作用并不是为了防止数据泄密,而是为了防止早期版本的协议中存在的代理缓存污染攻击(proxy cache poisoning attacks)等问题 。
7、Payload Data: 载荷数据
解析 WebSocket 报文代码如下:
文章插图
服务端发送 WebSocket 报文
返回时不携带掩码,所以 Mask 位为 0,再按载荷数据的大小写入长度,最后写入载荷数据 。
struct 模块解析
struct.pack(fmt, v1, v2, ...)按照给定的格式 fmt,把数据封装成字符串 ( 实际上是类似于 C 结构体的字节流 )
struct 中支持的格式如下表:
文章插图
为了同 C 语言中的结构体交换数据,还要考虑有的 C 或 C++ 编译器使用了字节对齐,通常是以 4 个字节为单位的 32 位系统,故而 struct 根据本地机器字节顺序转换 。可以用格式中的第一个字符来改变对齐方式,定义如下:
文章插图
发送 WebSocket 报文代码如下:
文章插图
总结
没有其他能像 WebSocket 一样实现全双工传输的技术了,迄今为止,大部分开发者还是使用 Ajax 轮询来实现,但这是个不太优雅的解决办法,WebSocket 虽然用的人不多,可能是因为协议刚出来的时候有安全性的问题以及兼容的浏览器比较少,但现在都有解决 。如果你有这些需求可以考虑使用 WebSocket:
- 多个用户之间进行交互;
- 需要频繁地向服务端请求更新数据 。
【WebSocket 通信过程与实现】
推荐阅读
- 乌龙茶做青过程香气的动态变化规律
- 普洱茶饼的制作过程
- 手把手教你使用阿里云服务器搭建网站全过程(图文教程)
- 银川,跟踪茶叶抽检全过程 茶叶农残均达标
- 一文带你看透数据库架构的演变过程
- 简单理解WEB服务静态和动态资源请求过程
- 一件代发能不能挣到钱 一件代发是怎么赚钱的,过程是什么
- 算法思路 过程动图 Java排序算法实现方式
- App与服务器的通信接口如何才能设计得更好?
- 窥探PC不能通过二层交换机跨网段通信原因:估计你想不到