WebSocket 帧大小限制

39

我通过Websockets发送了大量JSON数据。这个JSON可能有1000多个条目。由于帧大小的限制,Websocket协议会自动将JSON分成帧,这是无法避免的。我们无法更改websockets的帧大小。

问题:

当我尝试使用JSON.parse评估我的JSON时,它给出了一个解析错误,这很明显因为帧不是完整的JSON对象。所有这些都发生在Websocket onmessage事件回调中。如何接收分割成不同帧的大型JSON并仍能解析它? 我尝试在onmessage中连接帧,但错误仍然存在。

附加问题:

如何正确地合并断开的JSON?


副答案:按顺序,不漏掉任何块... - Eloff
1
有任何解决方案吗?我也遇到了同样的问题。 - dev2d
将此列表中的缓冲区大小参数添加到您的web.xml中。 https://github.com/Atmosphere/atmosphere/blob/master/modules/cpr/src/main/java/org/atmosphere/cpr/ApplicationConfig.java - Gaurav Bhor
3个回答

45
根据RFC-6455 base framing,单个WebSocket帧的最大大小限制为2^63字节(9,223,372,036,854,775,807字节 ~= 9.22 exabytes)(由@Sebastian更正)。然而,由1个或多个帧组成的WebSocket消息在协议级别上没有任何限制。每个WebSocket实现将以不同方式处理消息和帧限制,例如为整个消息设置最大消息大小(通常出于内存消耗原因),或者提供流选项以更好地利用内存来处理大型消息。但在您的情况下,您选择的WebSocket实现可能存在错误,并且错误地将JSON消息拆分为多个消息,而不是多个帧。您可以使用Chrome中的网络检查工具或外部工具(如Wireshark)来确认此行为。

2
它并不是将JSON拆分成多个消息,而是拆分成多个帧。我之所以知道这一点,是因为我使用了Chrome工具进行检查。我该如何处理?我正在使用Atmosphere框架。 - Gaurav Bhor
你尝试过更改WebSocket的缓冲区大小吗?让我们在Atmosphere邮件列表上进行讨论,但我怀疑您需要增加服务器WebSocket缓冲区大小。 - jfarcand
12
9.22艾克字节...我猜我需要更大的帧缓冲区。 - bvj

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

更改默认的maxFrameSize和MessageSize


我遇到了同样的错误。但是我正在运行客户端。这是否也适用于客户端...没有找到太多相关文档。 - mike01010

3

由于你正在处理低级别的 WS,所以需要创建一个应用协议来处理通过多个 WS 帧发送的数据。你需要将每个 WS 帧中的数据连接起来(不是连接帧…而是连接每个帧中的数据)。

基本上,你正在重新发明文件传输协议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接