Websocket框架大小限制

Websocket frame size limitation

本文关键字:框架 Websocket      更新时间:2023-09-26

我正在通过websocket发送大量的JSON数据。JSON可能有1000多个条目。由于帧大小的限制,Websocket协议会自动将JSON拆分为帧,这是没有帮助的。因为我们无法更改websocket的帧大小。

问题:

当我尝试使用JSON.parse评估JSON时,它会给我一个解析错误,这是显而易见的,因为帧不是完整的JSON对象。所有这些都发生在Websocket onmessage事件回调中。我如何才能在不同的帧中接收到巨大的JSON,并且仍然能够解析它?我已经尝试在onmessage中插入帧,但错误仍然存在。

附带问题:

如何正确地连接一个损坏的JSON?

根据RFC-6455基本帧,单个WebSocket帧的最大大小限制为2^63字节(9223372036854775807字节~=9.22 EB)(由@Sebastian更正)

然而,由1个或多个帧组成的WebSocket消息没有从协议级别对其施加限制。

每个WebSocket实现将以不同的方式处理消息和帧限制。例如为整个消息设置最大消息大小(通常是出于内存消耗的原因),或者为大型消息提供流选项以更好地利用内存。

但在您的情况下,您选择的WebSocket实现可能存在错误,并且不正确地将JSON消息拆分为多个消息,而不是多个帧。您可以使用Chrome中的网络检查工具或Wireshark等外部工具来确认这种行为。

var wsServer = new websocket.server({
            httpServer: server,
            maxReceivedFrameSize: 131072,
            maxReceivedMessageSize: 10 * 1024 * 1024,
            autoAcceptConnections: false
        });

更改默认的maxFrameSize&MessageSize

由于您处理的是WS,它是低级别的,因此需要创建一个应用程序协议来处理通过多个WS帧发送的数据。由您来连接每个WS帧中的数据(顺便说一句,不要连接这些帧……连接每个帧的数据)。

基本上,您正在重新设计一个文件传输协议。