Java:在PrintWriter缓冲流的close()之前需要flush()吗?

时间:2014-02-14 04:52:21

标签: java safari

我有一个网站,一旦它从我的服务器发出POST请求(返回一个字符串),客户端上的Web应用程序就会失去与Safari 7上服务器的连接(在OSX 10.9.1 Mavericks上),但是适用于Safari 5(在Mac 10.6.8 Snow Leopard上),Firefox,IE,Chrome。

使用Safari 7的Web Inspector,发出Post操作会返回错误Failed to load resource: The network connection was lost

使用网络分析仪,我检查了进入服务器并返回的数据包。实际上,一切都很好。并且,HTTP响应是status = 200(OK)。通过消除过程,我从登录时调用的Java POJO中删除了代码,并最终将错误缩小为一行代码:out.flush()。我已经总结了它如何在下面的Java Servlet代码片段中使用。评论flush()启用的Safari 7运行正常。

我不确定为什么flush()会导致Safari出现问题。这似乎是一种非常通用的Java设计模式(即flush()之前的close())。据我所知,close()不能保证包含flush()命令。但是,我确实注意到在没有包含flush()的情况下数据包大小略有减少,如果收到的字节数与预期的字节数不同,Safari可能会关闭连接。以下链接表明了这一点......

https://apple.stackexchange.com/questions/106550/safari-7-0-cannot-load-localhost?newreg=562476b72d114865992a9dad16fbb50c

当我注释掉flush()代码时,其他浏览器也可以正常工作。

我对Java专家的问题:

  1. 在没有首先发布close()健壮的情况下发布flush()的设计模式是什么?我会遇到问题吗?为什么或为什么不呢?

  2. 任何人都有更好的理论为什么Safari不喜欢flush()

  3. ----------- Java Servlet ---------

    package com.mycompany.servlet;
    ...
    public class UserLogin extends HttpServlet {
    
    protected void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
       ...
       // get input parameters
       userEmail=req.getParameter("uEmail");
       userPwd=req.getParameter("uPwd");
       // query database to retrieve variable1, variable2, etc.
       ...
       // write output response
       PrintWriter out = res.getWriter();
       out.println(variable1);
       out.println(variable2);
       out.println(variable3);
       ...
       out.flush();  // this line causes Safari 7.0 on Mac OSX 10.9.1 to lose connection
       out.close();
      }
    }
    

0 个答案:

没有答案