首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebSocket无法发送/接收超过65536个字符的字符串

问WebSocket无法发送/接收超过65536个字符的字符串
EN

Stack Overflow用户
提问于 2014-02-26 07:39:09
回答 1查看 2.8K关注 0票数 4

我遇到了奇怪的websocket问题:

Node.js中的服务器:

代码语言:javascript
复制
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);

浏览器中的客户端:

代码语言:javascript
复制
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中有最大消息长度吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-26 08:28:29

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

因此,我们对服务器端WebSocket实现有一个限制。您应该考虑使用节点-瓦夫作为服务器端的WebSocket包,因为这将支持4MiB的长度。在node.js中,提供更大的帧是不直接的,因为没有符号的32位整数是节点缓冲模块支持的最大数目。

更详细的答覆:

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

  1. 单字节(最多为0x7d)
  2. 两个字节(第一个字节为0x7e,因此我们知道如何将以下两个字节解释为长度)
  3. 8个字节(第一个字节为0x7f,因此我们将后面的8个字节解释为长度)

然而,正如一开始所指出的那样。八个字节是一个没有符号的64位整数,javascript本机不支持它。"websocket“包似乎只支持两个字节的长度决定字节。"walve“最多可达四个字节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22034824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档