WebSocket不能发送/接收超过65536个字符的string

我遇到了奇怪的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); } 

上面的例子工作,但如果我将65536 for循环更改为65537它失败 – 服务器不会打印“收到的消息”,并打印“连接closures”,而不会在服务器或客户端上报告错误。 WebSocket中有最大的消息长度吗?

WebSocket帧具有以字节表示forms定义的有效负载长度。 两个字节可以最大值为0xffff(65535)。 要以字节表示65536,至less需要三个字节(0x010000)。

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

更详细的答案:

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

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

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