【问题标题】:Websocket frame size limitationWebsocket 帧大小限制
【发布时间】:2014-01-06 06:43:17
【问题描述】:

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

问题:

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

附加问题:

如何正确连接损坏的 JSON?

【问题讨论】:

标签: javascript json string websocket atmosphere


【解决方案1】:

根据RFC-6455 base framing,单个 WebSocket 帧的最大大小限制为 2^63 字节(9,223,372,036,854,775,807 字节 ~= 9.22 艾字节)@Sebastian 更正)

但是,由 1 个或多个帧组成的 WebSocket 消息在协议级别上没有限制。

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

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

【讨论】:

  • 它不是将 JSON 拆分为多个消息,而是拆分为多个帧。我知道这只是因为我使用 Chrome 工具进行了检查。我该如何处理?我正在使用大气框架。
  • 您是否尝试更改 websocket 的缓冲区大小?让我们在 Atmosphere 邮件列表上进行讨论,但我怀疑您需要增加服务器 websocket 缓冲区大小。
  • 9.22 艾字节...我想我需要一个更大的帧缓冲区。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    var wsServer = new websocket.server({
                httpServer: server,
                maxReceivedFrameSize: 131072,
                maxReceivedMessageSize: 10 * 1024 * 1024,
                autoAcceptConnections: false
            });
    

    更改默认的 maxFrameSize 和 MessageSize

    【讨论】:

      猜你喜欢
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2019-02-02
      • 1970-01-01
      • 2017-05-05
      • 2015-08-29
      • 2019-05-08
      相关资源
      最近更新 更多