WebSocket 初窥

155 阅读3分钟

是什么

WebSocket是一种在Web浏览器和Web服务器之间建立持久连接的协议,允许双向通信。与HTTP不同,它允许服务器主动发送消息到客户端而不需要客户端请求。

这使得WebSocket成为实时应用程序的理想选择,例如聊天应用程序、在线游戏等。

WebSocket是一种在单个TCP连接上提供双向通信的网络协议,可以用于实时数据传输和通信。

优点

  1. 实时性:相比传统的HTTP请求响应模式,WebSocket可以实现服务器主动向客户端推送数据,从而实现实时性通信。
  2. 减少通信量:由于WebSocket使用长连接,只需要在建立连接时进行HTTP握手,之后数据交换时无需再携带HTTP头部等信息,因此减少了通信量,提高了效率。
  3. 更高效的网络利用率:由于WebSocket使用长连接,可以避免频繁的连接建立和断开,减少网络资源的消耗,提高了网络利用率。
  4. 跨域支持:由于浏览器中存在同源策略,不能直接跨域通信,但是WebSocket可以通过在服务器端进行代理来实现跨域通信。
  5. 实现双向通信:WebSocket可以实现客户端和服务器之间的双向通信,从而更加灵活地处理数据交换。

应用场景

  • 实时聊天:WebSocket可用于构建实时音视频聊天应用程序,通过WebSocket,客户端可以与服务器进行双向通信,从而实现实时通信。
  • 实时数据更新:WebSocket可用于构建实时数据更新应用程序,如股票行情、新闻推送等。当数据更新时,服务器可以立即将数据推送到客户端。
  • 在线游戏:WebSocket可用于构建在线游戏应用程序,通过WebSocket,游戏服务器可以将实时游戏事件发送给客户端,客户端可以立即响应这些事件。
  • 实时协作:WebSocket可用于构建实时协作应用程序,如Google Docs。当多个用户同时编辑文档时,服务器可以将实时更新推送到所有用户。
  • 远程控制:WebSocket可用于构建远程控制应用程序,如远程桌面、远程终端等。通过WebSocket,服务器可以将用户的操作发送到远程设备,并接收设备的响应。
  • 还有:基于位置的应用、视频会议、在线教育、社交订阅

简单案例

实现一个简单的聊天室应用程序,以下是该应用程序的基本结构:

  • 服务端:使用WebSocket库创建WebSocket服务器,并监听来自客户端的WebSocket连接请求。
  • 客户端:在Web浏览器中使用JavaScript代码创建WebSocket对象并连接到服务器。然后,客户端可以通过WebSocket对象发送和接收消息。

服务端:

const WebSocket = require('ws');

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

server.on('connection', (socket) => {
  socket.on('message', (message) => {
    // Broadcast message to all clients
    server.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });

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

客户端:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>WebSocket</title>
  </head>
  <body>
    <h1>WebSocket Chat Room</h1>
    <div id="messages"></div>
    <form id="message-form">
      <input type="text" id="message-input" />
      <button type="submit">Send</button>
    </form>

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

      socket.addEventListener('open', (event) => {
        console.log('Connected to server');
      });

      socket.addEventListener('message', (event) => {
        const messageDiv = document.createElement('div');
        messageDiv.textContent = event.data;
        document.getElementById('messages').appendChild(messageDiv);
      });

      document.getElementById('message-form').addEventListener('submit', (event) => {
        event.preventDefault();
        const messageInput = document.getElementById('message-input');
        const message = messageInput.value;
        socket.send(message);
        messageInput.value = '';
      });
    </script>
  </body>
</html>

总结:在这个例子中,服务器监听端口8080,客户端使用JavaScript代码创建WebSocket对象并连接到服务器。当用户提交聊天消息时,它会被发送到服务器并广播给所有连接的客户端。每个客户端都有一个事件监听器来接收新消息,并将其添加到聊天历史记录中。