gpt4 book ai didi

javascript - 如何在 JavaScript 中构建 Websocket 数据

转载 作者:行者123 更新时间:2023-11-30 12:38:56 25 4
gpt4 key购买 nike

我在 https://stackoverflow.com/a/10402443/2755042 找到了一个帖子解释如何编码/构建和解码 websocket 数据。我在编码部分遇到了麻烦。我能够成功地从客户端获取数据并将其记录到控制台,但是当我转身重新编码该消息并将其发送回客户端时,我收到一个错误:

net.js:614
throw new TypeError('invalid data');
^
TypeError: invalid data

这是我的编码代码:

function encodeWebSocket(bytesRaw){
var bytesFormatted = new Array();
bytesFormatted[0] = 129;
if (bytesRaw.length <= 125) {
bytesFormatted[1] = bytesRaw.length;
} else if (bytesRaw.length >= 126 && bytesRaw.length <= 65535) {
bytesFormatted[1] = 126;
bytesFormatted[2] = ( bytesRaw.length >> 8 ) & 255;
bytesFormatted[3] = ( bytesRaw.length ) & 255;
} else {
bytesFormatted[1] = 127;
bytesFormatted[2] = ( bytesRaw.length >> 56 ) & 255;
bytesFormatted[3] = ( bytesRaw.length >> 48 ) & 255;
bytesFormatted[4] = ( bytesRaw.length >> 40 ) & 255;
bytesFormatted[5] = ( bytesRaw.length >> 32 ) & 255;
bytesFormatted[6] = ( bytesRaw.length >> 24 ) & 255;
bytesFormatted[7] = ( bytesRaw.length >> 16 ) & 255;
bytesFormatted[8] = ( bytesRaw.length >> 8 ) & 255;
bytesFormatted[9] = ( bytesRaw.length ) & 255;
}
for (var i = 0; i < bytesRaw.length; i++){
bytesFormatted.push(bytesRaw.charCodeAt(i));
}
return bytesFormatted;
}

下面是使用encodeWebSocket函数的代码:

server.on('connection', function (socket) {
socket.on('data', function (data) {
// from client i send 'hello'
var decodedMessage = (decodeWebSocket(data));
console.log(decodedMessage); // hello
console.log(typeof decodedMessage); // string
var encodedMessage = encodeWebSocket(decodedMessage);
socket.write(encodedMessage);
});
});

基本上,我想做的就是创建一个聊天服务器,它接受一条消息,然后返回并将它发送回所有连接的其他客户端。

非常感谢任何帮助。

最佳答案

Cade 回答中的代码是一个合理的开始。但是下面的代码解决了一些要点。

首先,在处理unicode时,字符串长度和对应的缓冲区长度可能存在差异。例如:

> s = 'a'
'a'
> s.length
1
> b = new Buffer(s, 'utf-8')
<Buffer 61>
> b.length
1

但是:

> s = 'å'
'å'
> s.length
1
> b = new Buffer(s, 'utf-8')
<Buffer c3 a5>
> b.length
2

因此最好先将数据编码为Buffer,然后再使用Buffer的长度作为payload长度。

此外,有效负载长度可能 > 0xffff,其中有效负载长度需要八个字节,而不是两个字节。

下面代码中的其他两个细微差别是添加了一个可选的回调并将写入合并到一个调用中。虽然写入可能会被缓冲,但它们可能是两个系统调用。

function send(data, encoding, callback) {
var socket = this;
var header;
var payload = new Buffer(data, encoding);
var len = payload.length;
if (len <= 125) {
header = new Buffer(2);
header[1] = len;
} else if (len <= 0xffff) {
header = new Buffer(4);
header[1] = 126;
header[2] = (len >> 8) & 0xff;
header[3] = len & 0xff;
} else { /* 0xffff < len <= 2^63 */
header = new Buffer(10);
header[1] = 127;
header[2] = (len >> 56) & 0xff;
header[3] = (len >> 48) & 0xff;
header[4] = (len >> 40) & 0xff;
header[5] = (len >> 32) & 0xff;
header[6] = (len >> 24) & 0xff;
header[7] = (len >> 16) & 0xff;
header[8] = (len >> 8) & 0xff;
header[9] = len & 0xff;
}
header[0] = 0x81;
socket.write(Buffer.concat([header, payload], header.length + payload.length), 'binary', callback);
}

关于javascript - 如何在 JavaScript 中构建 Websocket 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189006/

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