2017-06-20 170 views
2

我想从龙卷风服务器发送gzip压缩数据到javascript客户端。这是我的代码。我可以通过Python中的龙卷风websocket发送gzip压缩数据吗?

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”。

这里有什么解决方法吗?

+0

您设置了哪些标头? –

+0

我也尝试设置标题,但Websockets是否需要标题? 这是我在搜索时发现的链接。 [链接](https://stackoverflow.com/questions/17082166/how-to-send-json-header-via-python-tornado-in-a-websocket) –

+0

我想你的客户期望使用一个子协议UTF-8。 –

回答

2

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

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

要实现这一点,在你WebSocketHandler子类中覆盖get_compression_options()

def get_compression_options(self): 
    return {} 

一个空的字典使用的默认设置,也可以像{'compression_level': 9}返回参数。在使用这种模式时,您只需像往常一样写信息而不是压缩信息。

+0

谢谢。我试着做你在那里指示的。 'def get_compression_options(self): return {'compression_level':9}' 但不幸的是数据没有被压缩。我发送的数据通常是这样的 'msg =“hello world” self.write_message(msg)' –

+0

您是如何确定数据未被压缩的?浏览器会在另一侧自动解压缩它。您需要查看原始网络流量以查看压缩是否正在进行。原始网络流量也可以使用wireshark这样的工具来检查压缩扩展是否由双方协商。 –