2012-01-10 61 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

相关问题