WebSocket介紹

Frontend SELF TW
等級 46 , 課堂 1
開放

6.1 WebSocket的主要概念

WebSocket 是一個通信協議,提供單個TCP連接的完整雙工通信通道。 它允許進行客戶端與伺服器之間的雙向數據傳輸, 使其成為需要實時不斷數據交換的應用程序的理想選擇,例如聊天室、 在線遊戲和通知系統。

WebSocket的優勢

  1. 雙向通信:WebSocket提供雙向數據傳輸,允許伺服器和客戶端隨時互相發送消息。
  2. 延遲更低:與傳統HTTP請求相比,WebSocket通過持續連接降低了延遲。
  3. 伺服器負載較低:WebSocket減少了HTTP請求的數量,從而降低了伺服器負載。

WebSocket的主要組件

  1. WebSocket伺服器:接受和處理WebSocket連接的伺服器端部分。
  2. WebSocket客戶端:建立與WebSocket伺服器連接並交換數據的客戶端部分。

6.2 在JavaScript中使用WebSocket

在JavaScript中使用WebSocket是通過WebSocket對象進行的,該對象提供了建立連接、發送和接收消息以及事件處理的方法。

創建WebSocket連接:

JavaScript
    
      const socket = new WebSocket('ws://server.example.com/chat');
    
  

WebSocket事件:

  1. open:當連接建立時觸發。
  2. message:當收到來自伺服器的消息時觸發。
  3. error:當出現錯誤時觸發。
  4. close:當連接關閉時觸發。

WebSocket使用範例:

JavaScript
    
      const socket = new WebSocket('ws://server.example.com/chat');

      socket.addEventListener('open', (event) => {
        console.log('Connected to the WebSocket server');
        socket.send('Hello Server!');
      });

      socket.addEventListener('message', (event) => {
        console.log('Message from server:', event.data);
      });

      socket.addEventListener('error', (event) => {
        console.error('WebSocket error:', event);
      });

      socket.addEventListener('close', (event) => {
        console.log('Disconnected from WebSocket server');
      });
    
  

6.3 在Node.js中使用WebSocket伺服器範例

可以在Node.js中使用ws庫來創建WebSocket伺服器。

安裝庫:

Terminal
    
      npm install ws
    
  

WebSocket伺服器範例:

JavaScript
    
      const WebSocket = require('ws');
      const wss = new WebSocket.Server({ port: 8080 });

      wss.on('connection', (ws) => {
        console.log('New client connected');

        ws.on('message', (message) => {
          console.log('Received:', message);
          ws.send(`Server says: ${message}`);
        });

        ws.on('close', () => {
          console.log('Client disconnected');
        });
      });

      console.log('WebSocket server is running on ws://localhost:8080');
    
  

6.4 WebSocket的主要事件與方法

客戶端事件:

  • onopen:當WebSocket連接建立時觸發
  • onmessage:當收到來自伺服器的消息時觸發
  • onclose:當WebSocket連接關閉時觸發
  • onerror:當WebSocket出現錯誤時觸發

客戶端方法

  • send(data):向伺服器發送數據
  • close(code, reason):用指定的代碼和原因關閉WebSocket連接

伺服器事件

  • connection:當有客戶端連接到伺服器時觸發
  • message:當伺服器收到來自客戶端的消息時觸發
  • close:當WebSocket連接關閉時觸發
  • error:當WebSocket出現錯誤時觸發

伺服器方法

  • send(data):向客戶端發送數據
  • close(code, reason):用指定的代碼和原因關閉WebSocket連接

6.5 WebSocket的使用範例

範例:實時聊天

客戶端部分:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>WebSocket Chat</title>
        </head>
        <body>
          <input type="text" id="message" placeholder="Enter your message" />
          <button onclick="sendMessage()">Send</button>
          <div id="chat"></div>

          <script>
            const socket = new WebSocket('ws://localhost:8080');
            const chat = document.getElementById('chat');

            socket.onopen = function() {
              console.log('WebSocket is open now.');
            };

            socket.onmessage = function(event) {
              const message = document.createElement('p');
              message.textContent = event.data;
              chat.appendChild(message);
            };

            socket.onclose = function() {
              console.log('WebSocket is closed now.');
            };

            socket.onerror = function(event) {
              console.error('WebSocket error observed:', event);
            };

            function sendMessage() {
              const messageInput = document.getElementById('message');
              const message = messageInput.value;
              socket.send(message);
              messageInput.value = '';
            }
          </script>
        </body>
      </html>
    
  

伺服器部分:

JavaScript
    
      const WebSocket = require('ws');

      const server = new WebSocket.Server({ port: 8080 });

      server.on('connection', (ws) => {
        console.log('New client connected!');

        ws.on('message', (message) => {
          console.log('Received:', message);
          // 向所有連接的客戶端廣播消息
          server.clients.forEach(client => {
            if (client.readyState === WebSocket.OPEN) {
              client.send(message);
            }
          });
        });

        ws.on('close', () => {
          console.log('Client disconnected');
        });

        ws.on('error', (error) => {
          console.error('WebSocket error:', error);
        });
      });

      console.log('WebSocket server is running on ws://localhost:8080');
    
  
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION