使用EventSource时,如何传递压缩文本

gg22g2
  • 223

我使用EventSource从后端获取数据,因为有的数据量达到20M,所有想使用压缩,减少流量。

我试过压缩返回的消息,只对实际消息部分压缩,前端用pako解压缩。
image.png
但是前端接收数据好像默认按照字符串解析了,导致我拿到的是乱码,做解压缩会失败。

如果我对整条消息做压缩,并设置content-encoding: gzip,那么我可以成功接收到一条数据,之后浏览器主动把连接关闭了,导致后续数据传递失败。
image.png

我可以通过限制返回的数据条数来减少流量,这是一种解决办法,但是我还是希望在不减少返回的数据量的情况下,减少流量消耗。

回复
阅读 517
2 个回答

serversent 推送仅支持纯文本,gzip不是纯文本压缩方式,肯定不支持。

可以考虑自己实现一套压缩方式,例如原始数据都是 ASCII 128以内的编码的字符, 而serversent支持推送Unicode编码所有字符,可以把多个进行合并到一个字符中。

不过最好还是别用serversent传输大文本, 考虑发送给客户端一个标记,客户端通过另外的http请求进行下载。

在设置content-encoding: gzip情况下,好像并没有办法解决只读取一次的问题。查看资料了解到,发送压缩数据到时候,因为压缩数据是有开始和结束标记的,读取到第一条数据的结束标记时,浏览器可能认为我的请求已经发送完了,就自动把请求断开了。

想到一个折中办法,就是在数据被压缩后,再转为base4,目前来看原数据字节数在1024以上时,经过压缩再转base64处理可以起到减小作用。所以现在是,数据大小低于1024字节不做处理,大于1024的做gzip压缩和base64。前端拿到数据后判断需不需要解码。效果还是很明显的,其中部分数据长度有350016字节,能被减小到78316字节。

宣传栏