我遇到了奇怪的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中是否有最大消息长度?
答案 0 :(得分:2)
WebSocket帧的有效负载长度以字节表示形式定义。最大的两个字节的值可以是0xffff(65535)。要以字节为单位表示65536,您至少需要三个字节(0x010000)。
因此我们对服务器端WebSocket实现有一定的限制。您应该考虑使用node-walve作为服务器端WebSocket包,因为这将支持长达4MiB的长度。服务较大的帧目前在node.js中没有直接做,没有缺点,因为无符号32Bit整数是节点缓冲模块支持的最大数。
更详细的答案:
单个WebSocket帧支持三种不同的帧长度:
然而正如开头所指出的那样。 8个字节是无符号的64位整数,本机不支持javascript。 “websocket”包似乎只支持两个字节的长度来确定字节。 “walve”最多四个字节。