- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
自从 Chrome 更新到 v14,他们从 version three of the draft至 version eight of the draft .
我有一个在 WebSocket 上运行的内部聊天应用程序,虽然我已经让新的握手工作正常,但数据框架显然也发生了变化。我的 WebSocket 服务器基于 Nugget .
是否有人让 WebSocket 与草案的版本 8 一起工作,并且有关于如何构建通过网络发送的数据的示例?
最佳答案
(另请参阅:How can I send and receive WebSocket messages on the server side?)
这很容易,但理解格式很重要。
第一个字节几乎总是1000 0001
,其中1
表示“最后一帧”,三个0
是保留位,没有到目前为止没有任何意义,0001
表示它是一个文本框(Chrome 使用 ws.send()
方法发送)。
(更新:Chrome 现在也可以使用 ArrayBuffer
发送二进制帧。第一个字节的最后四位将为 0002
,所以你可以区分文本和二进制数据。数据的解码工作方式完全相同。)
第二个字节包含一个 1
(意味着它被“屏蔽”(编码))后跟代表帧大小的七位。如果它在 000 0000
和 111 1101
之间,那就是大小。如果是111 1110
,后面的2个字节是长度(因为七位放不下),如果是111 1111
,下面的8个字节是长度长度(如果它也不适合两个字节)。
接下来是四个字节,它们是解码帧数据所需的“掩码”。这是使用 xor 编码完成的,该编码使用数据的 indexOfByteInData mod 4
定义的掩码之一。解码就像 encodedByte xor maskByte
一样(其中 maskByte
是 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
});
您还可以下载the specification这可能会有帮助(它当然包含您理解格式所需的一切)。
关于c# - 如何在 WebSockets hybi 08+ 中(反)构造数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040078/
我是一名优秀的程序员,十分优秀!