我通过websockets发送大量的JSON数据。 JSON可能有超过1000个条目。由于帧大小限制,Websocket协议自动将JSON分成帧,这是无法帮助的。因为我们无法改变websockets的框架大小。
问题:
当我尝试使用JSON.parse
评估我的JSON时,它给出了一个解析错误,这很明显,因为这些帧不是完整的JSON对象。所有这些都发生在Websocket onmessage
事件回调中。如何在不同的帧中接收巨大的JSON并仍然能够解析它?
我试图在onmessage
中连接帧,但错误仍然存在。
附带问题:
如何正确地合并破坏的JSON?
答案 0 :(得分:26)
每个RFC-6455 base framing的单个WebSocket帧的最大大小限制为2 ^ 63字节(9,223,372,036,854,775,807字节〜= 9.22艾字节)(由@Sebastian进行校正) < / p>
但是,由1个或多个帧组成的WebSocket消息对协议级别没有任何限制。
每个WebSocket实现都将以不同方式处理消息和帧限制。例如为整个消息设置最大消息大小(通常是出于内存消耗的原因),或者为大消息提供流选项以更好地利用内存。
但在您的情况下,您所选择的WebSocket实现可能存在错误,并且不正确地将JSON消息拆分为多个消息,而不是多个消息。您可以使用Chrome中的网络检查工具或Wireshark等外部工具来确认此行为。
答案 1 :(得分:2)
由于您正在处理低级别的WS,因此您需要创建一个应用程序协议来处理通过多个WS帧发送的数据。您可以连接每个WS帧中的数据(顺便说一句,不要连接帧...连接每个帧中的数据)。
基本上你正在重新发明文件传输协议。
答案 2 :(得分:1)
var wsServer = new websocket.server({
httpServer: server,
maxReceivedFrameSize: 131072,
maxReceivedMessageSize: 10 * 1024 * 1024,
autoAcceptConnections: false
});
更改默认的maxFrameSize&amp; MESSAGESIZE