我使用comet和tomcat6将数据推送到客户端。
我希望在连接关闭之前接收数据(XMLHttpRequest的ready state =3),问题是Tomcat6在发送数据之前会缓冲数据,所以我需要做一些棘手的事情来实现这一点。
我将请求内容类型设置为application/x-javascript,并将请求内容类型设置为application/xml (以禁用浏览器缓存)。
我在tomcat6中使用了许多可用选项来禁用缓存( nio连接器中的socketBuffer= -1,等等),这在我本地的tomcat6(在windows操作系统上)也是有效的(实际上,甚至没有修改任何默认选项)。
但是,在与Tomcat6配置相同的事件中,当我在http://jelastic.com提供的Tomcat6服务器上部署应用程序时,服务器输出缓冲区很大,我必须发送空字节来触发输出编写器刷新(cf.以下代码)
新建字节= byteevent.getHttpServletResponse().getBufferSize()-new Gson().toJson(messagesContent).getBytes().length;event.getHttpServletResponse().getOutputStream().write(new Gson().toJson(messagesContent).getBytes());event.getHttpServletResponse().getOutputStream().write(bytes);event.getHttpServletResponse().getOutputStream().flush();
如果除了我的数据内容之外不写入字节,数据就不会发送到客户端。这真的很烦人,因为我发送了无用的空字节,而且我必须在客户端管理这些空字节。太可怕了。
有谁有解决方案吗?如何禁用comet servlet输出缓冲区。在我看来很明显,默认情况下应该禁用comet servlet的输出缓冲区。听起来很奇怪。
先谢谢你,
J
发布于 2012-11-09 21:44:56
您是否尝试过使用Filters?http://www.oracle.com/technetwork/java/filters-137243.html来编写自定义请求和响应
使用装饰器模式,您可以控制输出。实现这一点的方法是向生成响应的servlet传递一个替换流。替代流阻止servlet在完成时关闭原始响应流。
class CharResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;
public String toString() {
return output.toString();
}
public ResponseWrapper(HttpServletResponse response) {
super(response);
output = new CharArrayWriter();
}
public PrintWriter getWriter(){
return new PrintWriter(output);
}
}因此,在过滤器的doFilter方法中,您将获得原始的PrintWritter,并传递包装器
PrintWriter out = response.getWriter();
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, wrapper);然后,Servlet会将所有输出写入CharrArrayWritter中,这样您就可以在没有缓冲的情况下获得字符串形式的输出
wrapper.toString()然后,您可以修改、附加..等,然后使用原始响应输出来写入内容。
out.write(wrapper.toString());
out.close();https://stackoverflow.com/questions/10352303
复制相似问题