gpt4 book ai didi

c# - 如何在 WebSockets hybi 08+ 中(反)构造数据帧?

转载 作者:太空狗 更新时间:2023-10-29 18:02:25 24 4
gpt4 key购买 nike

自从 Chrome 更新到 v14,他们从 version three of the draftversion 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 0000111 1101 之间,那就是大小。如果是111 1110,后面的2个字节是长度(因为七位放不下),如果是111 1111,下面的8个字节是长度长度(如果它也不适合两个字节)。

接下来是四个字节,它们是解码帧数据所需的“掩码”。这是使用 xor 编码完成的,该编码使用数据的 indexOfByteInData mod 4 定义的掩码之一。解码就像 encodedByte xor maskByte 一样(其中 maskByteindexOfByteInData 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com