サーバー送信イベントには、EventSource オブジェクト、メッセージ、オープン、エラーを通じてサーバーから送信されたイベントの通知を受け取る 3 つのイベントがあることがわかっています。今日は、サーバーが H5 でクライアントにデータをアクティブに送信する方法を説明します。実装手順は次のとおりです。
サーバー送信イベント
サーバー送信イベントは、EventSource オブジェクトを通じてサーバーによって送信されたイベントの通知を受け取ります。メッセージ、オープン、エラーの 3 つがあります
次のコードは、使用されるメソッドを示しています
コード実行環境の例: node .js
コード
ノードインデックスを実行するには、次のコードを貼り付けます。js
//index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>server-sent</title> </head> <body> <script> window.addEventListener("load",function () { let status = document.getElementById("status"); let output = document.getElementById("output"); let source; function connect() { source = new EventSource("stream");//与服务器端建立连接 //鉴定message事件, 获取服务端发送的数据 source.addEventListener("message", function (event) { output.textContent = event.data; }, false); //监听open事件, 判断连接是否进行中 source,addEventListener("open", function (event) { status.textContent = '连接打开了'; },false); //监听error事件, 处理连接错误的情况 source.addEventListener("error", function (event) { if (event.target.readyState === EventSource.CLOSED) { source.close(); status.textContent = '连接关闭了'; } else { status.textContent = "连接关闭了!未知错误!"; } }, false); } if(!!window.EventSource) { connect(); } else { status.textContent = "不支持server-sent" } },false); </script> <span id="status">Connection closed!</span> <br> <span id="output"></span> </body> </html>
サーバーコード
//index.js const http = require('http'); const fs = require('fs'); http.createServer(function (req, res) { let interval, fileName, index = "./index.html"; console.log(req.url); if(req.url === "/") { fileName = index; } else { fileName = "." + req.url; } if (fileName === "./stream") {//如果server sent event则设置相应头信息 res.writeHead(200, { "Content-Type" : "text/event-stream", "Cache-Control" : "no-cache", "Connection": "keep-alive", }) res.write("retry: 10000\n");//过10000秒重试 res.write("data: " + (new Date()) + "\n\n"); interval = setInterval(function () { res.write("data: " + (new Date()) + "\n\n"); }, 1000); //监听close事件, 用于停止定时器 req.connection.addListener("close", function () { clearInterval(interval); }, false); } else if (fileName === index) { //判断是否为页面请求, 并找到相应文件返回页面 fs.exists(fileName, function (exists) { if (exists) { fs.readFile(fileName, function (error, content) { if (error) { res.writeHead(500); res.end(); } else { res.writeHead(200, {"Content-Type" : "text/html"}); res.end(content, "utf-8"); } }) } else { console.log(123); res.writeHead(404); res.end(); } }) } else { res.writeHead(404); res.end(); } }).listen(8080, "127.0.0.1"); console.log("at 8080");
これらの事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、次のコードに注目してください。その他の関連記事は PHP 中国語 Web サイトにあります。
関連書籍:
以上がH5 でサーバーがクライアントにデータをアクティブに送信する実装手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。