首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Servlet:为什么PrintWriter.flush()不刷新?

Java Servlet:为什么PrintWriter.flush()不刷新?
EN

Stack Overflow用户
提问于 2009-07-13 21:20:01
回答 4查看 7.2K关注 0票数 2

我目前正在编写一个Comet应用程序,该应用程序要求我在持久连接上一次发送数据块。但是,在关闭连接之前,我无法将消息刷新到客户端。有什么原因导致PrintWriter.flush()方法的行为不像我认为的那样吗?

这是我的Tomcat Comet实现:

代码语言:javascript
复制
public void event(CometEvent event) throws IOException, ServletException {
    HttpServletRequest request = event.getHttpServletRequest();
    HttpServletResponse response = event.getHttpServletResponse();
    if (event.getEventType() == EventType.BEGIN) {
        request.setAttribute("org.apache.tomcat.comet.timeout", 300 * 1000);
        PrintWriter out = response.getWriter();
        out.println("BEGIN!");
        out.flush();
        System.out.println("EventType.BEGIN");
    } else if (event.getEventType() == EventType.READ) {
        InputStream is = request.getInputStream();
        byte[] buf = new byte[512];
        do {
            int n = is.read(buf); //can throw an IOException
            if (n > 0) {
                System.out.println("Read " + n + " bytes: " + new String(buf, 0, n) 
                        + " for session: " + request.getSession(true).getId());
            } else if (n < 0) {

                return;
            }
        } while (is.available() > 0);
        System.out.println("subtype: "+event.getEventSubType());
        System.out.println("EventType.READ");
    } else if (event.getEventType() == EventType.END) {
        PrintWriter out = response.getWriter();
        out.println("END!");
        out.close();
        System.out.println("checkError: "+out.checkError());
        System.out.println(event.getEventSubType());
        System.out.println("EventType.END");
        //eventWorker.enqueue(new EndEvent(request, response));
    } else if (event.getEventType() == EventType.ERROR) {
        PrintWriter out = response.getWriter();

        out.println("ERROR!");
        out.flush();
        System.out.println("checkError: "+out.checkError());
        System.out.println("subtype: "+event.getEventSubType());

        //response.getWriter().close();
        System.out.println("EventType.ERROR");
    } else {
        (new ServletException("EXCEPTION")).printStackTrace();
    }
}

所以在这里我试着发送消息“开始!”然后保持连接打开,这样我就可以发送更多的数据。但是,消息似乎要等到连接关闭后才会通过。

这是我的ajax代码:$.post('comet',function(data) { alert(data);});

运行此代码后,Firebug告诉我这是响应头: Server: Apache-Coyote/1.1 Transfer-Encoding: chunked Date: Mon,13 Jul 200921:16:29 GMT

这让我想到我的浏览器收到了一些数据,但是我如何在连接关闭之前更新页面上的数据呢?

EN

Stack Overflow用户

发布于 2009-08-08 15:41:13

我也遇到了几乎同样的问题:

两个电话都没打出去。

代码语言:javascript
复制
writer.flush();
writer.end();

除了上面两个之外,当我尝试执行response.flushBuffer()时,抛出了一个java.nio.charset.UnmappableCharacterException (在jboss 5.1下)。然后我添加了一个response.setCharacterEncoding("UTF-8);,这个问题就解决了。

这可能与你的问题无关,但由于我发现你的帖子是谷歌上的第一篇,所以我在这里回答有同样情况的人。

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1122133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档