我遇到了奇怪的 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 帧支持三种不同的帧长度:
- 单字节(到 0x7d)
- 两个字节(第一个字节为 0x7e,因此我们知道将后面的两个字节解释为长度)
- 八个字节(第一个字节是 0x7f 所以我们将后面的八个字节解释为长度)
但是正如开头所指出的。八个字节将是一个无符号的 64 位整数,javascript native 不支持它。 “websocket”包似乎只支持两个字节的长度确定字节。 “walve”最多四个字节。
关于node.js - WebSocket 无法发送/接收长度超过 65536 个字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22034824/