服务器发送的事件挂起浏览器 上海证券交易所 如果(!!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);