2016-12-14 85 views
0

我學習在Java服務器發送事件和我使用一個簡單的例子。我使用Windows 7,Java 1.7,Tomcat 7,Eclipse Indigo。我已經創建一個servlet(SseServer.java),此Servlet的代碼如下:服務器發送事件代碼不工作jelastic

package sse; 
import java.io.IOException; <br/> 
import java.io.PrintWriter;<br/> 
import java.util.Date;<br/> 

import javax.servlet.ServletException;<br/> 
import javax.servlet.annotation.WebServlet;<br/> 
import javax.servlet.http.HttpServlet;<br/> 
import javax.servlet.http.HttpServletRequest;<br/> 
import javax.servlet.http.HttpServletResponse;<br/> 

@WebServlet("/SseServer")<br/> 
public class SseServer extends HttpServlet {<br/> 
    private static final long serialVersionUID = 1L; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doPost(request, response); 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
      // Besides "text/event-stream;", Chrome also needs charset, otherwise 
      // does not work 
      // "text/event-stream;charset=UTF-8" 
      response.setContentType("text/event-stream;charset=UTF-8"); 
      response.setHeader("Cache-Control", "no-cache"); 
      response.setHeader("Connection", "keep-alive"); 

      PrintWriter out = response.getWriter(); 

      while (true) { 
      out.print("id: " + "ServerTime" + "\n"); 
      out.print("data: " + new Date().toLocaleString() + "\n\n"); 
      out.flush(); 
      // out.close(); //Do not close the writer! 
      try { 
      Thread.currentThread().sleep(1000); 
      } catch (InterruptedException e) { 
      e.printStackTrace(); 
      } 
      } 

    } 

} 

而且我顯示在一個HTML的結果,如下圖所示SSE.html,對於這個代碼:

<!DOCTYPE html> 
 
<html> 
 
<body> 
 
<h1>Current Server Time : </h1> 
 

 
<div id="ServerTime"></div> 
 

 
<script> 
 
    if (typeof (EventSource) !== "undefined") { 
 
    var source = new EventSource("http://localhost:8080/SSE/SseServer"); 
 
    
 
    // http://eastern1.j.layershift.co.uk 
 
    //var source = new EventSource("http://eastern1.j.layershift.co.uk/SSE/SseServer"); 
 
    source.onmessage = function(event) { 
 
    document.getElementById("ServerTime").innerHTML += event.data 
 
     + "<br><br>"; 
 
    }; 
 
    } else { 
 
    document.getElementById("ServerTime").innerHTML = "Sorry, your browser does not support server-sent events..."; 
 
    } 
 
</script> 
 

 
</body> 
 
</html>

當我每隔一秒後在本地運行這段代碼,我能看到當前的時間。我還檢查了幾個瀏覽器如Chrome,Firefox等

由於這個代碼是工作的罰款,我決定在雲中部署這一所以我選擇了Jelastic.com。我創建了一個war文件並將其部署在Jelastic上,並嘗試運行我的示例應用程序。但是,當我從運行雲應用程序,我只能看到

當前服務器時間:

我看不到的時間。有人可以告訴我爲什麼會發生這種情況嗎?有什麼我需要改變我的代碼?如果是,那麼有人可以請建議它應該是什麼?或者我應該在創建戰爭文件時更改eclipse中的其他文件/設置?

任何幫助,非常感謝。

+0

這eastern1.j.layershift.co.uk頁面無法找到。請檢查你的環境。 – Jelastic

+0

@Jelastic我第一次使用Jelastic。你能告訴我我該檢查什麼嗎? – Abb

回答

1

您曾使用絕對鏈接,這是一個不好的做法。嘗試使用相對鏈接。 你的錯誤是不對應的路徑鏈接服務器

var source = new EventSource("/SseServer"); 
+0

雖然這個代碼片斷可以解決的問題,[包括說明](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高您的文章質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – DimaSan

+0

@DOBA你是個天才!非常感謝你。我非常感謝你的幫助。這像一個魅力。我不能夠感謝你。如果可能,請與我分享您的電子郵件ID,以便我可以與您保持聯繫以備將來參考。 – Abb

相關問題