服务器发送事件的工作原理
我在tomcat 8.0上使用java尝试了SSE(Server-Sent-Events)。以下是我注意到的几件事。
我点击了一个按钮,它会自动向 servlet 发出请求。Servlet 的 GET 方法被执行,它返回一个事件流。收到完整的流后,页面再次自动发出另一个请求,该请求再次接收相同的数据!!!我在那里没有无限循环!!!
服务器上实际发生了什么?在正常情况下,tomcat 会创建一个线程来处理每个请求。现在发生了什么?
确保事件流仅向同一连接/浏览器会话发送一次的正确方法是什么?
确保事件流关闭且服务器上不会产生资源开销的正确方法是什么?
如何区分 GET 和 POST 请求。为什么选择 GET?
在Tomcat上使用SSE还为时过早吗?是否有任何性能问题?
这是好奇者的代码,
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//content type must be set to text/event-stream
response.setContentType("text/event-stream");
//cache must be set to no-cache
response.setHeader("Cache-Control", "no-cache");
//encoding is set to UTF-8
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
for(int i=0; i<10; i++) {
System.out.println(i);
writer.write("data: "+ i +"\n\n");
writer.flush();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
writer.close();
}
}
页面上的Javascript(我在页面上没有其他任何内容),
<button onclick="start()">Start</button>
<script type="text/javascript">
function start() {
var eventSource = new EventSource("TestServlet");
eventSource.onmessage = function(event) {
console.log("data: "+event.data)
document.getElementById('foo').innerHTML = event.data;
};
}
</script>
已使用 CURL 尝试此操作。而回应只来了一次。我使用的是chrome,所以这一定是chorme的问题??
编辑:
我所学到的内容现在记录在我的博客中 - 服务器发送事件