Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WebSocket可以';不要发送大数据_Javascript_Node.js_Websocket_Buffer - Fatal编程技术网

Javascript WebSocket可以';不要发送大数据

Javascript WebSocket可以';不要发送大数据,javascript,node.js,websocket,buffer,Javascript,Node.js,Websocket,Buffer,我有两个问题: 1。当我在Chrome中发送大于128 kb的文本或二进制文件时,Chrome会发送碎片websocket帧。这些帧应以最后一帧结束,并且fin=1。但Chrome也在发送带有未知操作码的帧 2.当我尝试在Firefox中发送大文件时,Firefox在我的家庭网络中发送数据的速度非常慢(约300kb/s,发送TCP包时速度会减慢),并且文件永远不会完成。此外,二进制文件的帧丢失。我用Wireshark追踪网络。同样的尝试也会带来狩猎的乐趣 我在Mac上使用Firefox 43.0

我有两个问题:

1。当我在Chrome中发送大于128 kb的文本或二进制文件时,Chrome会发送碎片websocket帧。这些帧应以最后一帧结束,并且fin=1。但Chrome也在发送带有未知操作码的帧

2.当我尝试在Firefox中发送大文件时,Firefox在我的家庭网络中发送数据的速度非常慢(约300kb/s,发送TCP包时速度会减慢),并且文件永远不会完成。此外,二进制文件的帧丢失。我用Wireshark追踪网络。同样的尝试也会带来狩猎的乐趣

我在Mac上使用Firefox 43.0.4,在Mac上使用Chrome 48.0.2564.97 Safari 9.0.3 我在Node.js中使用自己的服务器

更新 我发现了问题,但不知道解决办法

 socket.on('data', function(data) {
    buffer = Buffer.concat([buffer, data]);
    _editBuffer();
});
Buffer.concat会减慢传输速度。但是如何使用+运算符进行缓冲区连接呢?

我找到了一个解决方案。 每次二进制文件中的websocket帧到达服务器时,必须在追加模式下使用fs.createWriteStream写入此帧。在此之后,必须从写入的帧中切片缓冲区

 var stream  = fs.createWriteStream(__dirname + '/' + fileInfo.fileName, {flags:'a'});
...
stream.write(payload);

如果您不断地附加到一个每次都需要重新分配的缓冲区(这里可能是这种情况,不确定),您将获得O(N^2)性能。在最终需要之前,需要修改代码以避免实际加入数据缓冲区集,这可能需要修改一些周围的逻辑。您不能使用
+
运算符连接数组/缓冲区(如前所述,它只能添加数字和连接字符串)。如何才能做到这一点?我只有“socket on data”事件,并且必须存储传入的块,如果它只有一个像firefox中那样的websocket框架的话。看来,在客户端对大文件进行分块是最好的方法,这样就可以在peaces中编写文件。因为如果我在一个websocket帧中使用它,我必须将所有内容存储在一个缓冲区中,以解除有效负载的屏蔽。是这样吗?