2016-02-19 60 views
-1

我有兩個問題:的WebSockets不能發送大的數據

1.當我在Chrome發送文本或二進制大於128 KB,Chrome會將零散的WebSocket幀。這些幀應以最後一幀和fin = 1結束。但是Chrome也在發送帶有未知操作碼的幀。

2.當我嘗試在Firefox中發送大文件時,Firefox在我的家庭網絡中發送非常慢的數據(〜300kb/s並在發送TCP包時速度變慢),並且文件從未完成。此外,二進制文件的框架丟失。我用Wireshark跟蹤了網絡。 Safari通過相同的嘗試進行崩潰。

我使用的是Firefox 43.0.4的Mac和Chrome 48.0.2564.97適用於Mac的Safari 9.0.3 而且我用我自己的服務器中的Node.js

UPDATE 我找到了問題但不知道解決方案。

socket.on('data', function(data) { 
    buffer = Buffer.concat([buffer, data]); 
    _editBuffer(); 
}); 

Buffer.concat減慢傳輸速度。但是,我怎樣才能使用+運算符的緩衝區連接?

+0

如果你經常追加到每次需要重新分配的緩衝區(這裏可能是這種情況,不確定),你將會有O(N^2)的性能。代碼將需要修改,以避免實際加入數據緩衝區組,直到最終需要,這可能需要修改一些周圍的邏輯。您不能使用'+'運算符來加入數組/緩衝區(如[在本答案中所述](http://stackoverflow.com/a/7124918/1114),它只能添加數字和加入字符串)。 –

+0

這怎麼辦?我只有'socket on data'事件,並且必須存儲傳入的塊,如果它只有一個像Firefox一樣的websocket框架。看起來,在客戶端分塊大文件是最好的方法,因此比文件可以寫成peaces。因爲如果我在一個websocket框架中使用它,我必須將所有內容存儲在一個緩衝區中,以揭示有效載荷。是對的嗎 ? – benu

回答

-1

我找到了解決方案。 每次來自二進制文件的websocket幀都來到服務器時,該幀必須以追加模式寫入fs.createWriteStream。之後,必須從寫入的幀中切分出緩衝區。

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