使用EventSource时,如何传递压缩文本
我使用EventSource从后端获取数据,因为有的数据量达到20M,所有想使用压缩,减少流量。
我试过压缩返回的消息,只对实际消息部分压缩,前端用pako解压缩。
但是前端接收数据好像默认按照字符串解析了,导致我拿到的是乱码,做解压缩会失败。
如果我对整条消息做压缩,并设置content-encoding: gzip,那么我可以成功接收到一条数据,之后浏览器主动把连接关闭了,导致后续数据传递失败。
我可以通过限制返回的数据条数来减少流量,这是一种解决办法,但是我还是希望在不减少返回的数据量的情况下,减少流量消耗。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
serversent 推送仅支持纯文本,gzip不是纯文本压缩方式,肯定不支持。
可以考虑自己实现一套压缩方式,例如原始数据都是 ASCII 128以内的编码的字符, 而serversent支持推送Unicode编码所有字符,可以把多个进行合并到一个字符中。
不过最好还是别用serversent传输大文本, 考虑发送给客户端一个标记,客户端通过另外的http请求进行下载。
在设置content-encoding: gzip情况下,好像并没有办法解决只读取一次的问题。查看资料了解到,发送压缩数据到时候,因为压缩数据是有开始和结束标记的,读取到第一条数据的结束标记时,浏览器可能认为我的请求已经发送完了,就自动把请求断开了。
想到一个折中办法,就是在数据被压缩后,再转为base4,目前来看原数据字节数在1024以上时,经过压缩再转base64处理可以起到减小作用。所以现在是,数据大小低于1024字节不做处理,大于1024的做gzip压缩和base64。前端拿到数据后判断需不需要解码。效果还是很明显的,其中部分数据长度有350016字节,能被减小到78316字节。