WebSocket二进制传输返回的数据多于服务器发送的数据

时间:2016-11-17 14:44:23

标签: javascript node.js websocket

我遇到了通过WebSocket接收二进制数据的问题,即浏览器接收的字节数(以ArrayBuffer形式,在JavaScript中)高于服务器发送的字节数,即使Chrome或Firefox正确报告了多少字节数通过电线传输。

服务器端是Node JS,我使用了3个不同的软件包(ws,nodejs-websocket和websocket),它们的行为都相同。因此问题很可能是在浏览器中运行的JavaScript中。

我在客户端的代码如下所示:

1: var socket = new Websocket(url);
2: socket.binaryType = 'arraybuffer';
3: socket.onmessage = function(event) {
4:     var buffer = new Uint8Array(event.data);
5:     // consume the buffer
6: }

问题在于,如果我检查“缓冲区”的长度(第4行之后),它会高于从服务器发送的数据。

例如,如果服务器发送二进制内容,则为8个字节:

0xa1 0xb2 0xc3 0xd4 0xa1 0xb2 0xc3 0xd4

在客户端,我看到了:

0xc2 0xa1 0xc2 0xb2 0xc3 0x83 0xc3 0x94 0xc2 0xa1 0xc2 0xb2 0xc3 0x83 0xc3 0x94

更新:经过进一步检查后,我认为这与内存中数据的字对齐有关。例如,如果我发送以下数据: 0x7C 0x7D 0x7E 0x7F ,则表示已正确接收。但是,只要我消耗更高的位,例如 0x81 0xc2 就会被添加到数据中。

我无法相信我必须处理这个问题!也许我做错了什么,但我确实看过其他框架,用于通过websocket传输二进制数据,事实上,他们正在从字对齐的数组缓冲区中“解包”真实数据。

更新2:为了完成目的,这是服务器上发生的事情,使用NodeJS包websocket,其中 conn 是从中获取的Web套接字连接 websocket 包。

function sendBinary(conn, filename) {
    var size = 4096;
    var inputStream = fs.createReadStream(
        filename,
        {
            'flags': 'r',
            'encoding': 'binary',
            'bufferSize': size
        });
    inputStream.on('data', function(data) {
        conn.sendBytes(new Buffer(data));
    });
}

感谢您抽出宝贵时间阅读本文。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

打印或写入流时,请确保使用原始缓冲流,而不是字符串。 在您的情况下,您可能会输出字符串而不是缓冲区。 buf.toString()使用UTF-8编码作为默认值,UTF-8中的中文字符占用3字节,然后得到意外的字节。

顺便说一句,0xa1是中文字符开始的地方

请使用iconv-lite 如果需要,将字符串转换为缓冲区

或者参考this post在服务器端组合二进制缓冲区