2017-06-20 112 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這樣的工具來檢查壓縮擴展是否由雙方協商。 –