在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。 Cos 2214ms。
begin time: 09:47:55.488
Over time: 09:47:56.702
在Chrome浏览器中,太多的框架花费大量时间进行通信。
答案 0 :(得分:0)
铬缺陷报告:
超过131k的websocket文本框架在Mac版Chrome上被截断
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慢。