首页 > 解决方案 > 如何在 Chrome 中调整 websocket 二进制帧长度(最大限制为 113KB)

问题描述

在 Chrome 中使用 Websocket 发送 blob 时。Blob 已自动拆分为小块(二进制帧)。块的最大大小为 113KB,过多的小二进制帧会使上传速度变慢。如何解决这个问题呢?

在 Firefox 中,Bolb 只发送一个二进制帧。

基于netty的WebSocket服务器(最大帧大小4MB):

      .childHandler(
          new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) {
              ch.pipeline()
                  .addLast(new HttpServerCodec())
                  .addLast(new HttpObjectAggregator(Integer.MAX_VALUE))
                  .addLast(new WebSocketServerCompressionHandler())
                  .addLast(
                      new WebSocketServerProtocolHandler(
                          "/", null, true, 4194304
                      )
                  )
                  .addLast(new WebSocketFileHandler());
            }
          }
      );

客户端 Javascript 使用 Websocket 发送文件(Blob):

websocket.send(File) //File size 1.7MB

在 Firefox 中测试,只有一个 Websocket Binary Frame。花费 329 毫秒。

begin time: 09:50:34.835
Over  time: 09:50:35.164

在 Chorme,15 Websocket 二进制框架中进行测试。每帧大约 112KB。因为 2214 毫秒。

begin time: 09:47:55.488
Over  time: 09:47:56.702

在 Chrome 中,过多的帧会花费大量的时间进行通信。

Chrome Websocket 框架

标签: javascriptgoogle-chromewebsocketbinaryframe

解决方案


铬错误报告:

超过 131k 的 websocket 文本帧在 Chrome for Mac 上被截断

https://bugs.chromium.org/p/chromium/issues/detail?id=517090

调整 Websocket 中框架的最大大小

https://bugs.chromium.org/p/chromium/issues/detail?id=870965

原因是服务器不支持“接收碎片消息”。当我将服务器从 netty 更改为 Gorilla WebSocket 时,问题解决了。只有一帧由 chrome 发布。

但是chrome的速度也比firefox慢。


推荐阅读