我一直期待着回答同一個樣的問題,當涉及到SSE,這裏是我的研究:
我有一個基本的javax的HttpServlet,將打印數據每RANDO秒一個PrintWriter。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
System.out.println("You just entered the doGetMethod");
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = null;
while(true){
try{
System.out.println("You just entered the while loop");
double randomNumber = Math.random()*10000;
printWriter = response.getWriter();
printWriter.print("data: " + "[next server time check event in " +
Math.round(randomNumber/1000) + " seconds]\n");
printWriter.print("data: " + "Time: " + Calendar.getInstance().getTime() + "\n\n");
response.flushBuffer();
Thread.sleep((long)randomNumber);
} catch (IOException | InterruptedException e){
e.printStackTrace();
break;
}
}
System.out.println("Connection was aborted");
}
這裏是填補了{textarea的ID =「displayTextArea}元素
<script>
var eventSource = null;
function start(){
eventSource = new EventSource('http://localhost:8080/SSEServlet');
eventSource.onopen = function(){displayTextArea.value+='Connected ..' + '\n';};
eventSource.onmessage = function(message){displayTextArea.value+=message.data + '\n\n';};
eventSource.onerror = function(){displayTextArea.value+='Error Occurred...' + '\n';};
}
function stop(){
eventSource.close();
}
function clearText(){
displayTextArea.value = '';
}
</script>
腳本 - 要回答你的第一個問題:
如果你看控制檯當您運行應用程序中,您將注意到控制檯不會打印「您剛剛輸入了doGetMethod」,直到您向Servlet路徑發送HTTP GET請求爲止,這確認了Servlet實例和req/resp對象不會在有人呼叫servlet。How do servlets work?
- 第二和第三個問題:
默認情況下,Tomcat將爲每個連接分配一個線程(Source)。在我目前的配置下,我的程序最多可以連接6個連接。每個連接都將創建它自己的servlet實例,並且在連接打開時,將保留在while循環中。當我運行服務器並打開單獨的連接,看到不同的時間和隨機間隔的順序時,這已被證明。我的while循環不是無限的,雖然它一直等到連接關閉,然後會拋出異常並中斷while循環。連接關閉後,servlet將關閉。
我這樣做的方式非常非常做業餘SSE的方式。如果你想爲此學習高級圖書館,我會退房jeaSSE
如果有人想要完整code