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

Java:PrintWriter缓冲流的close()之前是否需要flush()?,java,safari,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操作返回错误加载资源失败:网络连接丢失 使用网络分析仪,我检查了发送到服务器和返回的数据包。事实上,一切看起来都很好。并且,HTTP响应的

我有一个网站,只要它从我的服务器发出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操作返回错误
加载资源失败:网络连接丢失

使用网络分析仪,我检查了发送到服务器和返回的数据包。事实上,一切看起来都很好。并且,HTTP响应的状态为=200(OK)。通过消除过程,我从登录时调用的Java POJO中删除了代码,并最终将错误缩小为一行代码:
out.flush()
。我在下面的JavaServlet代码片段中总结了如何使用它。注释掉
flush()

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

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

我向Java专家提出的问题:

  • 发出
    close()
    而不先发出
    flush()
    的设计模式是否稳健?我会遇到问题吗?为什么

  • 有谁能更好地解释为什么Safari不喜欢
    flush()

  • -----------Javaservlet---------


    中发生了什么?您是否在servlet中使用了
    RequestDispatcher
    ?@SotiriosDelimanolis--
    ..
    只接受用户的电子邮件地址和密码(例如
    getParameter
    ),然后查询返回
    variable1
    variable2
    等的数据库。我将更新问题以包含这一点。没有使用
    RequestDispatcher
    。相关链接:
    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();
      }
    }