服务器发送的事件代码不适用于 jelastic
Server Sent event code not working on jelastic
我正在学习 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 上,并尝试 运行ning 我的示例应用程序。但是当我 运行 来自云的应用程序时,我只能看到
当前服务器时间:
我没看到时间。有人可以告诉我为什么会这样吗?我的代码中有什么需要更改的吗?如果是,那么有人可以建议它应该是什么吗?或者我应该在创建 war 文件时在 Eclipse 中更改其他一些 file/settings 吗?
非常感谢任何帮助。
你使用了绝对link,这是一个不好的做法。尝试使用相对 link。
您的错误是 link 与服务器上的路径不对应
var source = new EventSource("/SseServer");
我正在学习 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 上,并尝试 运行ning 我的示例应用程序。但是当我 运行 来自云的应用程序时,我只能看到
当前服务器时间:
我没看到时间。有人可以告诉我为什么会这样吗?我的代码中有什么需要更改的吗?如果是,那么有人可以建议它应该是什么吗?或者我应该在创建 war 文件时在 Eclipse 中更改其他一些 file/settings 吗?
非常感谢任何帮助。
你使用了绝对link,这是一个不好的做法。尝试使用相对 link。 您的错误是 link 与服务器上的路径不对应
var source = new EventSource("/SseServer");