【问题标题】:Can I send gzip compressed data through tornado websocket in Python?我可以通过 Python 中的 tornado websocket 发送 gzip 压缩数据吗?
【发布时间】:2017-06-20 05:25:59
【问题描述】:

我想将 gzip 压缩数据从 tornado 服务器发送到 javascript 客户端。这是我的代码。

buf = StringIO()
gfile = gzip.GzipFile(mode='wb', fileobj=buf)
try:
    gfile.write( "hello world" )
finally:
    gfile.close()

compressed_data = buf.getvalue()    
self.write_message( compressed_data )

服务器端不提供错误。但是 chrome 会产生错误“无法将文本帧解码为 UTF8”。

这里有什么解决方法吗?

【问题讨论】:

  • 你设置了哪些标题?
  • 我也尝试设置标头,但 Websockets 需要标头吗?这是我在搜索时找到的链接。 link
  • 我猜你的客户需要一个使用 utf-8 的子协议。
  • 客户端将数据解释为 utf-8 编码文本,因此无法解码。您需要指定适当的 MIME 类型:application/gzip

标签: javascript python websocket tornado


【解决方案1】:

使用self.write_message(compressed_data, binary=True) 发送二进制消息。您还需要更改应用程序的客户端以解压缩它。

请注意,二进制数据在 javascript 中可能难以处理,因此您可能希望使用 websocket 压缩扩展而不是自己压缩数据(这将使 Tornado 自动压缩数据,而浏览器将对其进行解压缩)。

要启用此功能,请在您的 WebSocketHandler 子类中覆盖 get_compression_options()

def get_compression_options(self):
    return {}

空字典使用默认值,或者您可以返回{'compression_level': 9} 之类的参数。使用此模式时,您只需像往常一样编写消息,而不是压缩它。

【讨论】:

  • 谢谢。我试着按照你在那里的指示去做。 def get_compression_options(self): return {'compression_level': 9} 但不幸的是数据没有被压缩。我正常发送数据是这样msg="hello world" self.write_message( msg )
  • 您是如何确定数据没有被压缩的?浏览器会在另一边自动解压。您需要查看原始网络流量以查看是否正在发生压缩。也可以使用wireshark之​​类的工具检查原始网络流量,以查看双方是否正在协商压缩扩展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多