网站首页 > 技术文章 正文
前言
之前的几篇文章介绍了如何搭建websocket服务器,这篇文章我们聊聊如何利用websocket的扩展来做一些事情。
当浏览器向websocket服务器发送连接请求时,服务器可能想要浏览器提供更多的信息,此时Sec-WebSocket-Extensions请求头也就是今天所讲的websocket的扩展就可以派上用场了,下面我们来看一看如何使用这个请求头!
扩展解析规则
Sec-WebSocket-Extensions请求头对应的值拥有一定的规则,这样服务端可以根据这个固定的规则进行解析。
这个请求头对应的值只能由以下字符组成:
// '!', '#', '#39;, '%', '&', ''', '*', '+', '-', // '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'
除此之外,逗号、分号、双引号和等号是特殊字符,有特殊的作用!
我们先看几个demo,大家就能明白它的规则(Sec-WebSocket-Extensions简写为swe),如下:
//demo1 swe: foo //解析结果 {"foo":[{}]} //demo2 swe: foo;bar //解析结果 {"foo":[{"bar":[true]}]} //demo3 swe: foo;bar;baz //解析结果 {"foo":[{"bar":[true],"baz":[true]}]} //demo4 swe: foo;bar=1;baz=2 //解析结果 {"foo":[{"bar":["1"],"baz":["2"]}]} //demo5 swe: foo;bar=1, qwe;baz=2 //解析结果 {"foo":[{"bar":["1"]}],"qwe":[{"baz":["2"]}]} //demo6 swe: foo;bar=1, foo;baz=2 //解析结果 {"foo":[{"bar":["1"]},{"baz":["2"]}]} //demo7 swe: foo;bar="1" //解析结果 {"foo":[{"bar":["1"]}]}
以上列出7种扩展情况,并且分别给出了服务器解析出的结果,总结规则如下:
- 解析结果是一个对象,对象是两层结构,如下:
{ outerKey1: [ {innerKey: [value,...], ...}, ... ], outerKey2: [ {innerKey: [value,...], ...}, ... ], ... }
- 逗号分隔第一层;
- 分号分隔第二层,分号分割后的第一个字符串是结果的第一级属性,剩余的字符串就是对应的第二级属性及其对应的值,如果字符串中有等号,等号前面的字符串是第二级属性,等号后面的字符串就是第二级属性对应的值,如果没有等号,第二级属性对应的值就是true;
- 等号后面的值加双引号或者不加,效果一样,如demo7;
- 在每一层级中出现相同的属性,解析时会将它们的值合并在一个数组中,如demo6;
如图1所示是真实浏览器发送的请求,请求头Sec-WebSocket-Extensions的值是permessage-deflate; client_max_window_bits,根据上面的规则服务器可以将其解析成如下形式:
{"permessage-deflate":[{"client_max_window_bits":[true]}]}
压缩/解压websocket传输的数据
图1中Sec-WebSocket-Extensions请求头的值带有deflate、windowBits字样,如果你看了上一篇介绍zlib的文章,你应该能想到此时浏览器想要告知服务器咱俩在通信时可以先将数据进行压缩再发送。
下面我们来看看具体如何实现
第一步服务器获取扩展请求头的值,然后解析,如下:
offers就是服务器通过请求头Sec-WebSocket-Extensions的值最终解析出来的对象,解析之后还需要发送Sec-WebSocket-Extensions响应头。
第二步利用zlib模块对即将发送的数据进行压缩
是否需要压缩以及压缩函数的参数可以通过offers获取,换句话说这些信息都是浏览器通过请求头Sec-WebSocket-Extensions告诉服务器的,浏览器可以通过这个请求头的值来控制服务器的一些行为。此处压缩函数采用createDeflateRaw方法,因为它压缩后的数据没有zlib格式的头尾,节省数据量,这在上一篇文章中介绍过。
待数据压缩完成之后再把数据按照传输协议的格式进行拼装,后面的流程就和《详解前端websocket服务器之数据传输协议》这篇文章介绍的一致了。
第三步利用zlib模块对即接收到的数据进行解压缩
首先按照数据传输协议将数据实体解析出来,传输协议的rsv1位会告知服务器接收到的数据有没有被压缩,如果被压缩了,需要多一步解压操作。
如图4,解压采用和压缩相对的函数createInflateRaw。
综上,websocket服务是否开启解压缩以及解压缩函数的参数都可以通过解析Sec-WebSocket-Extensions请求头来获取。
总结
本文主要介绍了如何利用Sec-WebSocket-Extensions请求头来做解压缩,其实它携带什么样的值,解析规则如何以及利用这些值来做什么,都可以由服务器和客户端自主约定,而不仅仅只能做解压缩!
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!
- 上一篇: 当前端也拥有 Server 的能力
- 下一篇: 呀!原来这就是前端监控系统
猜你喜欢
- 2024-11-18 Web前端、应用服务器、数据库SQL等性能优化总结
- 2024-11-18 C# .NET 6 校园图书管理系统:第七章 引入前端界面
- 2024-11-18 清华架构师用24章Git笔记带你完全学会Git,GitHub,Gitserver
- 2024-11-18 作为一名前端工程师,这些你一定要懂
- 2024-11-18 程序员私活攻略 (下)
- 2024-11-18 Web前端最强JavaScript Excel处理插件——exceljs
- 2024-11-18 前端必读书籍推荐
- 2024-11-18 手写一个main的Tomcat容器,构建Http服务器
- 2024-11-18 vue项目本地开发完成后部署到服务器后报404是什么原因呢?
- 2024-11-18 前端工程化体系设计与实践第4章第1节本地开发服务器解决的问题
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 604℃几个Oracle空值处理函数 oracle处理null值的函数
- 595℃Oracle分析函数之Lag和Lead()使用
- 583℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 580℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 575℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 569℃【数据统计分析】详解Oracle分组函数之CUBE
- 555℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 549℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)