在Google Chrome中,服务器发送事件(Server Sent Event)无法正常工作

3
这是我的服务器JSP代码“Server_Date.jsp”
<%
response.setHeader("cache-control", "no-cache"); 
response.setContentType("text/event-stream");
out.print("data: " + (new java.util.Date()).toString() + "x\n\n");
out.flush();   
%>

这是我的客户端JSP页面“Client_Serverdate.jsp”。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"     "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body  onload="begin()">
<h1>Getting server updates</h1>
<div id="result"></div>
<script >
if(typeof(EventSource)!=="undefined")
{     
var source=new EventSource("Server_Date.jsp");      
source.addEventListener("message", function(event) {
    document.getElementById("result").innerHTML = event.data;
}, false);
}
else
{
document.getElementById("result").innerHTML="Sorry, your browser does not support server-sent events...";
}
</script>   
</body>
</html>

请帮我看一下这段代码,它在Mozilla Firefox和Opera浏览器中运行良好,但在Google Chrome浏览器中无法正常工作(我已经检查了18.x和20.x版本)。

它将转到服务器页面,我已经使用打印语句进行了检查,但没有到达document.getElementById("result").innerHTML = event.data;这一行。


可能是Chrome浏览器对换行符('\n')有问题。尝试不使用'\n'。 - Ravi Jain
@RaviJain 我已经尝试过不加\n的情况了。如果我在source.addEventListener()之前使用alert(),它会提示,但在函数内部就不会提示...请帮帮我。 - R D
4个回答

1

首先,您正在调用一个未定义的函数begin(),尽管这不应该是问题所在。

Chrome开发控制台是否显示任何错误?它应该至少显示一个,因为涉及到begin函数。网络选项卡是否显示与Server_Date.jsp的通信流量?


Chrome开发控制台有显示任何错误吗?不,Chrome控制台没有错误... 它正在调用Server_Date.jsp,但是该文件返回的数据未在Client_Serverdate.jsp文件中打印。 - R D

1
我曾经遇到过同样的问题。作为服务器端,我使用了PHP,但我猜它的工作方式应该是一样的。对我来说解决这个问题的方法是添加ob_flush()。现在,我不知道在你的语言中应该是什么,但也许它可以帮助你朝着正确的方向前进。

在 JSP 中,ob_flush() 的替代方法是 out.flush(),但它在 Chrome 中无法正常工作,这就是我的问题...请帮帮我... - R D

1

我遇到了同样的问题,我通过在servlet末尾添加一个换行符来解决它。就像这样:

response.setContentType("text/event-stream;charset=UTF-8");
response.addHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.println("data: " + new Date());
out.println();
out.flush();
out.close();

1

问题已解决

解决方案:

页面编码问题:客户端使用UTF-8编码

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

服务器端没有提到UTF-8,因此在setContentType中添加charset=UTF-8后它可以工作

response.setContentType("text/event-stream;charset=UTF-8");

感谢各位花时间回答我的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接