2012-01-10 116 views
0

我想將一些JSON流式轉換爲通過我寫的GZIPFilter。到目前爲止,我已經能夠調整過濾器來刷新,當我告訴它,它可能會輸出兼容的gzip瀏覽器數據。 我將輸出重定向到一個文件並運行gzip -cd -v test.gz,它產生了預期的輸出,然後是'意外的文件結束'。使用GZIP將JSON流式傳輸到瀏覽器

問題是瀏覽器仍然看到零輸出(螢火蟲),所以我想知道是否瀏覽器解釋了gzip流的部分刷新。

該流包含大部分JavaScript指令/對象,應在客戶端接收和解析。該servlet被調用一次並在整個會話期間保持打開狀態,向客戶端提供數據;連接未關閉,因此流繼續運行,從服務器提供一種推送數據。

我的設置: 的WinXP 32位, GWT 2.4.0, Jetty7.4 .., GzipFilter(含調整), 火狐8 /鉻10

至於我每RFC知道的規格內容僅在流結束後才被解碼,所以我想要做的事可能不可能。不過,您可能有一些建議可以在主流瀏覽器上進行。

後來編輯:

  • GzipFilter通過web.xml中指定並且它是確定
  • 瀏覽器接收內容編碼:gzip
  • 字節正被寫入測試的類HTTPResponse流
  • 在編譯和實時GWT模式下
  • 使用字符集iso-8859-1進行測試或未指定
  • content-type是tex T/HTML
  • 沒有通過web.xml中的一切應用濾鏡
+0

什麼編寫自己的gzip過濾器,而不是使用碼頭的一個原因? – milan 2012-01-10 16:58:38

+1

修正了它。在我被允許提交我的答案後,我會寫詳細信息。我這樣做是因爲GzipFilter上的刷新沒有註冊,直到outputStream被關閉,所以如果你正在嘗試實時流,這是行不通的。 – brainwash 2012-01-10 19:49:00

+0

在問題中包括你的動機是很好的,可能有其他人有同樣的問題。 – milan 2012-01-10 20:08:45

回答

0

固定它。我使用自定義中介OutputStream進行調試,將輸出寫入文件以及一些統計信息,我想我留下了一些未覆蓋的方法。一旦我刪除它,它正在工作。

我的參數,對於那些足夠的好奇心:

  • 緩衝區大小:8K
  • 分鐘的gzip尺寸:64B
  • 刷新您需要擴展GzipStream gzip的數據流,覆蓋沖洗方法將壓縮級別設置爲零,然後再次放回,放氣()。
  • 與一個指向該自定義Gzip已/ Deflater流

正如我已經說過更換gzOut流賦值操作,這樣做的原因是JSON的流媒體直播對象瀏覽器,而無需關閉套接字。直到所有瀏覽器都正確實現WebSocket。對於推送數據,你需要一個WebSocket實現,或者你需要一個始終打開的連接,服務器可以推送數據。

後來編輯:重新發明輪子後:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4255743

相關問題