如何在 WebSockets hybi 08+ 中构建(解构)数据帧?

2023-11-29

自从 Chrome 更新到 v14 以来,它们从草案第三版 to 草案第八版.

我有一个在 WebSocket 上运行的内部聊天应用程序,虽然我已经让新的握手工作正常,但数据框架显然也发生了变化。我的 WebSocket 服务器基于Nugget.

是否有人使用 WebSocket 来处理草案的第八版,并提供有关如何构建通过网络发送的数据的示例?


(也可以看看:如何在服务器端发送和接收 WebSocket 消息?)


这相当简单,但理解格式很重要。

第一个字节几乎总是1000 0001,其中1意思是“最后一帧”,三个0s 是保留位,到目前为止没有任何意义,并且0001意味着它是一个文本框架(Chrome 使用ws.send()方法)。

(Update:Chrome 现在还可以发送二进制帧ArrayBuffer。第一个字节的最后四位将是0002,因此您可以区分文本和二进制数据。数据解码的工作方式完全相同。)

第二个字节包含一个1(意味着它被“屏蔽”(编码))后面跟着代表帧大小的七位。如果是介于000 0000 and 111 1101,这就是尺寸。如果它是111 1110,接下来的 2 个字节是长度(因为它不适合 7 位),如果是111 1111,接下来的 8 个字节是长度(如果两个字节也放不下)。

接下来是四个字节,它们是解码帧数据所需的“掩码”。这是使用 xor 编码完成的,该编码使用由以下定义的掩码之一indexOfByteInData mod 4的数据。解码就像encodedByte xor maskByte (where maskByte is indexOfByteInData mod 4).

现在我必须说我根本没有使用 C# 的经验,但这是一些伪代码(我担心有些 JavaScript 口音):

var length_code = bytes[1] & 127, // remove the first 1 by doing '& 127'
    masks,
    data;

if(length_code === 126) {
    masks = bytes.slice(4, 8);   // 'slice' returns part of the byte array
    data  = bytes.slice(8);      // and accepts 'start' (inclusively)
} else if(length_code === 127) { // and 'end' (exclusively) as arguments
    masks = bytes.slice(10, 14); // Passing no 'end' makes 'end' the length
    data  = bytes.slice(14);     // of the array
} else {
    masks = bytes.slice(2, 6);
    data  = bytes.slice(6);
}

// 'map' replaces each element in the array as per a specified function
// (each element will be replaced with what is returned by the function)
// The passed function accepts the value and index of the element as its
// arguments
var decoded = data.map(function(byte, index) { // index === 0 for the first byte
    return byte ^ masks[ index % 4 ];          // of 'data', not of 'bytes'
    //         xor            mod
});

您还可以下载规格这可能会有所帮助(当然它包含理解格式所需的所有内容)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WebSockets hybi 08+ 中构建(解构)数据帧? 的相关文章

随机推荐

  • php shell命令错误GLIBCXX_3.4.9未找到

    我试图从 php 执行 shell 命令将文件转换为 pdf 但出现此错误 有人可以详细解释我如何修复它吗 我不太擅长linux 而且 如果我直接通过终端执行命令 一切都会正常 usr lib libreoffice program oos
  • 我为什么可以在 std::vector 中使用前向声明的类?

    我认为您只能创建指向前向声明类的引用或指针成员 然而 我惊讶地发现这个有效 include
  • 在 GAE 上使用 boto3 - 遇到 Popen 问题

    我正在尝试在 Google App Engine 中运行一些 python 代码 该代码向 Amazon SQS 发送消息 我已经安装了 boto3 但在尝试将其导入我的 AppEngine 服务时遇到错误 File base data h
  • 使用 R 中的 Match 函数查找“第一次出现”

    我是 R 和 Stackoverflow 的新手 所以请原谅我提出这个非常基本的问题 我正在尝试在我的数据集中找到第一个女性的 索引 代码快照 我的整个数据集称为 自行车 所以首先我认为分配一个仅包含性别的新向量是个好主意 bike gen
  • 使用填充堆叠不同长度的 Numpy 数组

    a np array 1 2 3 b np array 4 5 l a b 我想要一个功能stack padding这样 assert stack padding l np array 1 2 3 4 5 0 numpy 是否有实现的标准方
  • Prolog 将分钟转换为小时

    这是我创建的代码 mins to hours In H M In lt 60 H 0 M is In mins to hours In H M In gt 60 H is H1 1 In1 is In 60 mins to hours In
  • jQuery AJAX 请求 302 重定向 - 哪些回调可用?

    我正在使用一个使用 jQuery 1 2 6 的旧系统 我正在通过以下方式发送 AJAX 请求jQuery ajax功能 它所访问的 URL 正在发送 302 HTTP 重定向响应 并最终以 200 HTTP OK 响应结束 我已经注册了两
  • 如何将 $SHELL 变量传递到 perl 搜索和替换中

    我有以下两个命令 value grep o Logs txt textFILE perl i wpe s onclick img document getElementById img 1 img style display img sty
  • ftplib.FTP 超时行为不一致

    我正在尝试使用ftplib FTP 使用超时选项作为特定主机名的超时值 但我遇到了奇怪的行为 为了测试它 我编写了一段非常简单的代码 import ftplib from ftplib import FTP ftp ftplib FTP g
  • 将表达式作为参数传递:关键字不能是表达式

    这是我的行动 gt gt gt def show d print d gt gt gt test result True gt gt gt show test result True gt gt gt show test info Some
  • 使用 SDL 2 和 -static 进行编译时收到对各种 Windows 库的未定义引用?

    我正在对 SDL2 中的 Wolfenstein 3D 引擎进行修改 使用 Wolf4SDL 作为基础 并且遇到了一个问题 在链接器选项中使用 static 时 我得到了对各种事物的大量未定义引用 这是我的构建日志来说明我的意思 Build
  • 将数据集动态绑定到 RDLC 报告

    我想将动态数据集绑定到 rdlc 如果我在 ASPX 文件中使用内联数据源 静态绑定 我可以查看报告 但是 如果我使用以下代码 报告查看器将继续显示 正在加载 图像 我已经检查了数据集名称 如果我将数据集名称更改为 Orders2 它会显示
  • 如何修复 AttributeError: 'NoneType' 对象没有属性 'text'...循环时

    我是初学者 这个论坛上的答案非常宝贵 我正在使用 Python 3 和 Beautiful Soup 通过循环页码从同一网站上的多个网页中抓取 非表 数据 它有效 但我不断收到 AttributeError NoneType object
  • 触摸设备(iOS、Android)

    触摸输入上有刻度吗 我知道有灵敏度设置可以说明是否触摸 但它也有硬压力和低压的刻度吗 如果有 规模是多少 0 到 1 或 0 255 或者什么可能性 嗯 这完全取决于 API 以 Android 为例 有一个getPressure Moti
  • 如何在android中播放来自url的动画GIF图像?

    我正在将 giphy 集成到我的 Android 应用程序中 我怎样才能玩animated gifAndroid 中的 URL 中的图像 我应该使用ImageView WebView VideoViewETC 例如 如果我想播放动画this
  • 无法在 JavaScript 警报框中添加新行?

    我在 PHP 中生成一个字符串 然后最终将该字符串传递到 JavaScript 警报框中 我的问题是我实际上无法在警报框中添加换行符 我的代码如下所示 str This is a string n alert str This is the
  • CPython 和 PyPy 小数运算性能

    我想使用数百万个数据点 以小数表示 运行 100k 次模拟 我选择小数而不是浮点数是为了浮点精度和易于对我的逻辑进行单元测试 因为0 1 0 1 0 1对于浮点数不等于 0 3 我希望通过使用 PyPy 来加快模拟速度 但在我的测试过程中我
  • Python 中的类与类型

    我最近刚刚开始自学如何编码 我目前正在阅读想想Python 2对于 python 3 以及当它教授有关type 函数 它给出了例子type 2 哪个输出
  • Powershell 2.0 sudo 限制

    长期读者 但新海报 我已经为这个问题苦苦挣扎了一整天 这让我发疯 在搜索了这个网站和谷歌之后 我仍然陷入困境 基本上 我不知道如何在 Powershell 中实现与 Copy Item CmdLet 一起使用的 sudo 这是我的代码 简介
  • 如何在 WebSockets hybi 08+ 中构建(解构)数据帧?

    自从 Chrome 更新到 v14 以来 它们从草案第三版 to 草案第八版 我有一个在 WebSocket 上运行的内部聊天应用程序 虽然我已经让新的握手工作正常 但数据框架显然也发生了变化 我的 WebSocket 服务器基于Nugge