Javascript WebSocket可以';不要发送大数据
我有两个问题: 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中使用自己的服务器 更新 我发现了问题,但不知道解决办法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
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帧中使用它,我必须将所有内容存储在一个缓冲区中,以解除有效负载的屏蔽。是这样吗?