node.js - WebSocket 无法发送/接收长度超过 65536 个字符的字符串

标签 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 有最大消息长度限制吗?

最佳答案

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

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

更详细的回答:

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

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

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

关于node.js - WebSocket 无法发送/接收长度超过 65536 个字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22034824/

相关文章:

websocket - 如何在Chrome中正确检查WebSocket框架?

javascript - 使用 Sanity npm 包开 Jest 模拟测试

node.js - 使用 pug extends 时传递变量

websocket - Tomcat7 Websocket 聊天示例 : How to load Websocket Server?

websocket - 我想在 HashMap 中保留一个引用,但我无法正确指定生命周期

JavaScript - 引用错误 : WebSocket is not defined

javascript - 在 JavaScript WebSocket 中隐藏 IP

node.js - MongoNetworkError : failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127. 0.0.1:27017]

javascript - __proto__ 在 JavaScript 中仅显示一个继承

javascript - 进行更改后刷新页面不会在网络浏览器中呈现