2013-05-07 137 views
4

我有一个使用servlet简单的服务器发送事件的运行实现。服务器使用服务器端发送事件作为servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    // TODO Auto-generated method stub 

    try 
    { 
     System.out.println("Server Sent Events"); 
     response.setContentType("text/event-stream"); 

     PrintWriter pw = response.getWriter(); 
     int i=0; 
     pw.write("retry: 30000\n"); 
     System.out.println("----------------------"); 
     while(true) 
     { 
      i++; 

      pw.write("data: "+ i + "\n\n"); 
      System.out.println("Data Sent : "+i); 
      if(i>10) 
       break; 
     } 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

而我的客户端代码是

<!DOCTYPE html> 
<html> 
<body onload ="SSE()" > 
<script> 

    function SSE() 
    { 
     var source = new EventSource('GetDate'); 
     source.onmessage=function(event) 
     { 
      document.getElementById("result").innerHTML+=event.data + "<br />"; 
     }; 
    } 
</script> 
<output id ="result"></output> 

</body> 
</html> 

但任何人都可以解释我这实际上是如何工作的? 就像服务器如何一次发送11个整数块? 是否需要在此处刷新或关闭Printwriter。 服务器是否每次都发起新的连接以发送数据

+0

不完全是重复的,但[是一个很好的解释](http://stackoverflow.com/q/5195452/575527) – Joseph 2013-05-07 06:38:51

+0

有一个特殊的原因,你为什么使用'while'循环?你从0到10,这是'for'循环的共同目的...... – 2013-05-07 06:40:22

+0

你究竟有什么不明白,你已经明白了什么?你试图找出“它”是如何工作的?抛出一些代码并说“请解释”对我来说似乎不是一个好问题... – Uooo 2013-05-07 06:43:06

回答

2

响应流将内容写入http数据包的消息体中。当你循环整数时,所有这些都会逐个添加到内容中。除非刷新/关闭未在流上关闭,否则您可以继续在流上写入,并且在发送响应时一切都会立即发送。

还有一些关于刷新和关闭的注意事项。您不需要清理,servletcontainer会为您刷新并关闭它。关闭的方式已经隐式调用flush.Calling刷新通常只有当你有多个作家在同一个流,你想切换作者(例如文件与混合二进制/字符数据),或者当你想保持流指针在不确定的时间打开(例如日志文件)。

相关问题