HTTP SSL上的流未刷新



我有一个在nginx后面运行的web应用程序。有些页面可以通过http访问,有些则通过https访问。我有一些"页面",它们相当于流,因为应用程序不会关闭连接,并在数据到来时提供数据。然后提要看起来是这样的:

 TIME1 MESSAGE1
 TIME2 MESSAGE2
 ...
 TIMEn MESSAGEn

在每一行之后,我写"\n",然后调用flush()。通过http,它可以正常工作,我的客户端可以监听新数据。但是,通过https,客户端在连接关闭之前不会接收任何数据。

 ServletOutputStream stream = applicationModel.getOutputStream();
 OutputStreamWriter streamWriter = new OutputStreamWriter(stream);
 BufferedWriter writer = new BufferedWriter(streamWriter);
 while (true) {
     wait();
     writer.write(newMessage);
     writer.flush();
 }

除非应用程序与web服务器紧密集成,否则写入程序上的刷新只会刷新应用程序内部的缓冲区,以便将数据发送到web服务器。在web服务器内部有更多的缓冲区,这些缓冲区是通过发送更大的TCP数据包来优化流量所必需的,从而减少数据的开销。而且,如果你使用SSL,还有另一层需要关注,因为你的数据将被封装到SSL帧中,这再次增加了开销,所以里面不仅有几个字节的有效负载是很好的。最后,操作系统内核有缓冲区,如果希望有更多的数据,它可能会将小TCP数据包的发送推迟一段时间。

请注意,您想要控制缓冲区是违背HTTP的基本设计概念的。HTTP基于这样一种想法,即您有一个从客户端到服务器的请求,然后有一个来自服务器的响应,理想情况下预先具有已知的内容长度。在最初的设计中,不知道响应的发展速度很慢,也不知道一旦新数据到达,浏览器将在哪里更新显示。获取更新的真正方法是让客户端发送另一个请求,然后发回新的响应。另一种方法是使用WebSockets。

相关内容

  • 没有找到相关文章

最新更新