【问题标题】:WebSocket not able to send/receive string longer than 65536 charactersWebSocket 无法发送/接收长度超过 65536 个字符的字符串
【发布时间】:2014-02-26 16:28:29
【问题描述】:

我遇到了奇怪的 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 有最大消息长度吗?

【问题讨论】:

    标签: node.js websocket


    【解决方案1】:

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

    所以我们有一个服务器端 WebSocket 实现的限制。您应该考虑使用 node-walve 作为服务器端 WebSocket 包,因为这将支持高达 4MiB 的长度。在 node.js 中提供更大的帧目前不是直接的,没有缺点,因为无符号 32 位整数是节点缓冲区模块支持的最大数字。

    更详细的答案:

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

    1. 单字节(最多 0x7d)
    2. 两个字节(第一个字节为 0x7e,因此我们知道将后面的两个字节解释为长度)
    3. 八个字节(第一个字节是 0x7f,因此我们将后面的八个字节解释为长度)

    但是正如开头所指出的那样。八个字节将是 javascript 本身不支持的无符号 64 位整数。 “websocket”包似乎只支持两个字节的长度确定字节。 “walve”最多四个字节。

    【讨论】:

    • 4MiB 用于 32 位?你的意思是 4GiB?
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2019-11-19
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2020-03-19
    相关资源
    最近更新 更多