gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:21:51 24 4
gpt4 key购买 nike

我遇到了奇怪的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com