日常開發:Websocket初探

WebSocket使用方法

前端使用方法

  • 利用WebSocket建立一個WebSocket對象
  • 通過監聽該對象的 onopen, onmessage方法,實現數據的交互,處理後端傳來的信息
<!--- Game1 --->
<!DOCTYPE html>
<html lang="en">
  <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>Document</title>
  </head>
  <body>
    <h1>Gamer 1</h1>
    <button id="buildBtn">Build</button>
    <input type="text" id="message" />
    <button id="sendBtn">Send</button>
    <button id="close">Close</button>
    <script>
      window.onload = function() {
        var build = document.getElementById("buildBtn");
        var send = document.getElementById("sendBtn");
        var close = document.getElementById("close");

        build.addEventListener("click", () => {
          const socket = new WebSocket("ws://127.0.0.1:8001");

          socket.onopen = () => {
            console.log("socket is on server");
            socket.send(JSON.stringify({ user: "game1", message: "" }));
          };

          socket.onmessage = function(e) {
            console.log("message=", e);
            const div = document.createElement("div");
            div.innerText = e.data;
            document.body.append(div);
          };

          if (socket.readyState === WebSocket.OPEN) socket.onopen();

          window.s = socket;
        });

        send.addEventListener("click", () => {
          var $input = document.getElementById("message");
          if (window.s && window.s.readyState === WebSocket.OPEN) {
            var socket = window.s;
            socket.send(
              JSON.stringify({
                user: "game1",
                message: $input.value,
                to: "game2"
              })
            );
          } else {
            alert("沒有WebSocket連接");
          }
        });

        close.addEventListener("click", () => {
          if (window.s && window.s.readyState === WebSocket.OPEN) {
            window.s.close(1000, JSON.stringify({ user: "game1" }));
            window.s = null;
          }
        });
      };
    </script>
  </body>
</html>

後端模擬

  • 使用nodejs-websocket 進行模擬

具體使用nodejs創建一個websocket的過程可以參考websocket探祕

主要需要配置的頭信息包括

  • connection: Upgrade -> 連接信息必須設置爲升級類型
  • Upgrade: websocket -> 升級類型爲websocket
  • Sec-WebSocket-Accept: 該值通過瀏覽器發送的websocket請求頭和後端生成的GUID標識共同生成
var ws = require("nodejs-websocket");

var connectionMap = {};

// Scream server example: "hi" -> "HI!!!"
var server = ws
  .createServer(function(conn) {
    console.log("New connection");
    getConnections();

    // 獲取文本
    conn.on("text", function(str) {
      console.log("Received message");
      const receiveData = JSON.parse(str);
      const { user, message, to } = receiveData;
      console.log(receiveData);

      if (!connectionMap[user]) {
        connectionMap[user] = conn;
        return;
      }

      if (connectionMap[to]) {
        const toUser = connectionMap[to];
        toUser.sendText(message);
      } else {
        console.log("用戶未上線");
      }

      //   conn.sendText();
    });

    conn.on("close", function(code, reason) {
      const { user } = JSON.parse(reason);
      delete connectionMap[user];
      console.log("Connection closed");
    });
  })
  .listen(8001, "127.0.0.1", () => {
    console.log("server is on ws://127.0.0.1:8001");
  });

  function getConnections() {
      console.log(server.connections);
  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章