【问题标题】:Server Sent event code not working on jelastic服务器发送的事件代码在jelastic上不起作用
【发布时间】:2016-12-14 11:16:06
【问题描述】:

我正在学习 Java 中的服务器发送事件,为此我使用了一个简单的示例。我正在使用 Windows 7、Java 1.7、Tomcat 7、Eclipse Indigo。我创建了一个servlet(SseServer.java),这个servlet的代码如下:

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 上并尝试运行我的示例应用程序。但是当我从云端运行应用程序时,我只能看到

当前服务器时间:

我看不到时间。有人可以告诉我为什么会这样吗?我的代码有什么需要更改的吗?如果是,那么有人可以请教它应该是什么吗?或者我应该在创建war文件时更改eclipse中的一些其他文件/设置?

非常感谢任何帮助。

【问题讨论】:

  • 找不到此 eastern1.j.layershift.co.uk 页面。请检查您的环境。
  • @Jelastic 我第一次使用 Jelastic。你能告诉我我应该检查什么吗?

标签: java server-sent-events jelastic


【解决方案1】:

您使用了绝对链接,这是一种不好的做法。尝试使用相对链接。 您的错误是该链接与服务器上的路径不对应

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

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • @DOBA 你真是个天才!非常感谢你。我真的很感谢你的帮助。这就像一个魅力。我不能感谢你。如果可能,请与我分享您的电子邮件 ID,以便我与您保持联系以备将来参考。
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 2021-07-09
  • 2018-09-22
  • 2022-01-16
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多