2014-02-26 328 views
4

我遇到了奇怪的WebSocket問題:在node.js的的WebSocket無法發送/接收的字符串長度超過65536個字符

服務器:

var websocket  = require('websocket'); 
var http   = require('http'); 

var transportServer = http.createServer(function(request, response) {}); 
var wsServer = new websocket.server({ httpServer: transportServer }); 

wsServer.on('request',function(request) { 
    var connection = request.accept(null,request.origin); 
    console.log('connected'); 

    connection.on('message',function(message) { 
     console.log('message received'); 
    }); 

    connection.on('close',function(){ 
     console.error('connection closed'); 
     process.exit(0); 
    }); 
}); 

transportServer.listen(5000); 

客戶端的瀏覽器:

var ws = new ReconnectingWebSocket 'ws://localhost:5000' 
ws.onopen = function(){ 
    var buf = ''; 
    for(var i = 1; i <= 65536; ++i) buf = buf + 'a'; 
    ws.send(buf); 
} 

例上述作品,但如果我在for循環改變6553665537失敗 - 服務器不打印「消息接收」並打印「連接關閉」,而不是和沒有錯誤報告在服務器或客戶端上。 WebSocket中是否有最大消息長度?

回答

2

的WebSocket幀具有在字節表示定義它們的有效負載長度。兩個字節可以最大值爲0xffff(65535)。要以字節表示65536,至少需要三個字節(0x010000)。

因此,我們必須在服務器端的WebSocket實施的限制。您應該考慮使用node-walve作爲服務器端的WebSocket包,因爲這將支持長度達4MiB。目前,在node.js中服務更大的幀並不是沒有缺點,因爲無符號32位整數是節點緩衝區模塊支持的最大數量。

更詳細的解答:

單一的WebSocket框架支持三種不同的幀長度:

  1. 單字節(最多0x7d)
  2. 兩個字節(第一個字節將0x7E的,所以我們知道將以下兩個字節解釋爲長度)
  3. 八個字節(第一個字節是0x7f,所以我們解釋以下八個字節爲長度)

之初然而,隨着指出。八個字節將是一個無符號的64位整數,它本身不支持javascript。 「websocket」包似乎只支持確定字節長度的兩個字節。 「walve」最多爲四個字節。

+0

4MiB爲32位? 4GiB你的意思是? –

相關問題