ホームページ  >  記事  >  ウェブフロントエンド  >  H5 でサーバーがクライアントにデータをアクティブに送信する実装手順

H5 でサーバーがクライアントにデータをアクティブに送信する実装手順

php中世界最好的语言
php中世界最好的语言オリジナル
2017-12-04 10:28:052316ブラウズ

サーバー送信イベントには、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 = &#39;连接打开了&#39;;
        },false);
        //监听error事件, 处理连接错误的情况
        source.addEventListener("error", function (event) {
          if (event.target.readyState === EventSource.CLOSED) {
            source.close();
            status.textContent = &#39;连接关闭了&#39;;
          } 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(&#39;http&#39;);
const fs = require(&#39;fs&#39;);
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 サイトにあります。

関連書籍:

HTML5 タグのネスト ルールの詳細な紹介

HTML5 および CSS3 とのブラウザ互換性の問題

じゃんけん効果のための HTML5 チュートリアル

以上がH5 でサーバーがクライアントにデータをアクティブに送信する実装手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。