服务器发送的事件挂起浏览器 上海证券交易所 如果(!!window.EventSource){ var source=neweventsource(“sse.php”); }否则{ 警报(“您的浏览器不支持服务器发送的事件!请升级!”); } source.addEventListener(“消息”,函数(e){ 控制台日志(如数据); 如果(如数据){ x=document.getElementById(“计时器”); x、 innerHTML=e.data; 控制台日志(如数据); }否则{ 控制台日志(如数据); e、 close(); } },假); source.addEventListener(“打开”,函数(e){ log(“连接已打开”); },假); source.addEventListener(“错误”,函数(e){ 日志(“错误-连接丢失。”+e); },假);
我的服务器端代码服务器发送的事件挂起浏览器 上海证券交易所 如果(!!window.EventSource){ var source=neweventsource(“sse.php”); }否则{ 警报(“您的浏览器不支持服务器发送的事件!请升级!”); } source.addEventListener(“消息”,函数(e){ 控制台日志(如数据); 如果(如数据){ x=document.getElementById(“计时器”); x、 innerHTML=e.data; 控制台日志(如数据); }否则{ 控制台日志(如数据); e、 close(); } },假); source.addEventListener(“打开”,函数(e){ log(“连接已打开”); },假); source.addEventListener(“错误”,函数(e){ 日志(“错误-连接丢失。”+e); },假);,php,html,server-sent-events,Php,Html,Server Sent Events,我的服务器端代码 <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>SSE</title> <script type="text/javascript"> if (!!window.EventSource) { var source = new EventSource("sse.php"); }
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>SSE</title>
<script type="text/javascript">
if (!!window.EventSource) {
var source = new EventSource("sse.php");
} else {
alert("Your browser does not support Server-sent events! Please upgrade it!");
}
source.addEventListener("message", function(e) {
console.log(e.data);
if(e.data){
x = document.getElementById("timer");
x.innerHTML=e.data;
console.log(e.data);
}else{
console.log(e.data);
e.close();
}
}, false);
source.addEventListener("open", function(e) {
console.log("Connection was opened.");
}, false);
source.addEventListener("error", function(e) {
console.log("Error - connection was lost."+e);
}, false);
</script>
</head>
<body>
<div id="timer"></div>
</body>
</html>
我的代码有什么问题?请让我知道。服务器端:通常这种演示在发送每封邮件之间都有一个睡眠。它将要做的是,在10毫秒(或更多)的时间内发送10个数据包 因此,客户机将几乎同时获取所有数据,您将在计时器中看到“1” 客户端:看起来不错。不过,了解一下控制台中记录的内容会很有用。(可能10,10,9,9,…,1,1,10,10,9,9,…,永远重复-见下一位。) 两者均:我认为退出时将发生的情况是,套接字将关闭,浏览器将检测到并重新连接。再次给你同样的序列
总之,将服务器端代码主循环更改为:
<?php
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");
$lastId = 0;
while (true) {
$data =10;
if ($data) {
sendMessage($lastId, $data);
$lastId++;
$data--;
}else{
exit;
}
}
function sendMessage($id, $data) {
//echo "id: $id\n";
echo "$data\n\n";
ob_flush();
flush();
}
?>
也就是说,发送一个明确的“0”通知客户端断开连接
然后在客户端,注意显式关闭代码。(实际上,我会选择“END”之类的词,因为“0”很容易被计算为布尔值false!)
while (true) {
$data =10;
if ($data) {
sendMessage($lastId, $data);
$lastId++;
$data--;
}else{
sendMessage($lastId, "0");
sleep(1); //Give client time to deal with it.
break;
}
sleep(1); //1 sec between messages
}
source.addEventListener("message", function(e) {
console.log(e.data);
if(e.data==="0")e.close();
else if(e.data){
x = document.getElementById("timer");
x.innerHTML=e.data;
}
//else do nothing
}, false);