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

我有一个WebSocket接收二进制数据的问题,即浏览器接收到的字节数(以ArrayBuffer的forms,在JavaScript中)高于服务器发送的数据,即使Chrome或Firefox正确报告多less个字节被传输线。

服务器端是Node JS,我使用了3个不同的包(ws,nodejs-websocket和websocket),它们都performance相同。 所以这个问题很可能是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 

更新:经过进一步的检查,我认为这与内存中数据的字alignment有关。 例如,如果我发送以下数据: 0x7C 0x7D 0x7E 0x7F ,它被正确接收。 但是,一旦我消耗更高的位,如0x81,0xc2被添加到数据。

我不敢相信我必须处理这个! 也许我做了一些错误的事情,但是我曾经看过其他的框架来通过websocket传输二进制数据,事实上,他们是从一个字alignment的数组缓冲区中“解开”真正的数据。

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

 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)); }); } 

感谢您抽出时间来阅读。 非常感谢您的帮助。

打印或写入stream时,请确保使用原始缓冲stream,而不是string。 在你的情况下,你可能outprintstring,而不是缓冲区。 buf.toString()使用默认编码UTF-8,而UTF-8中的中文字符需要3个字节,然后得到意外的字节。

顺便说一句,0xa1是汉字开始的地方

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

或者参考这篇文章 ,在服务器端组合二进制缓冲区