WebSocket无法发送/接收超过65536个字符的字符串

时间:2014-02-26 07:39:09

标签: node.js websocket

我遇到了奇怪的websocket问题:

node.js中的

服务器:

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循环中的65536更改为65537则失败 - 服务器不会打印'收到消息'并打印'连接已关闭'而服务器上没有报告错误或客户。 WebSocket中是否有最大消息长度?

1 个答案:

答案 0 :(得分:2)

WebSocket帧的有效负载长度以字节表示形式定义。最大的两个字节的值可以是0xffff(65535)。要以字节为单位表示65536,您至少需要三个字节(0x010000)。

因此我们对服务器端WebSocket实现有一定的限制。您应该考虑使用node-walve作为服务器端WebSocket包,因为这将支持长达4MiB的长度。服务较大的帧目前在node.js中没有直接做,没有缺点,因为无符号32Bit整数是节点缓冲模块支持的最大数。

更详细的答案:

单个WebSocket帧支持三种不同的帧长度:

  1. 单字节(最多0x7d)
  2. 两个字节(第一个字节为0x7e,因此我们知道将后两个字节解释为长度)
  3. 八个字节(第一个字节为0x7f,因此我们将后面的八个字节解释为长度)
  4. 然而正如开头所指出的那样。 8个字节是无符号的64位整数,本机不支持javascript。 “websocket”包似乎只支持两个字节的长度来确定字节。 “walve”最多四个字节。