javascript - 如何在 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 中,过多的帧会花费大量的时间进行通信。
解决方案
铬错误报告:
超过 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慢。