WebSocket

79 阅读3分钟

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许客户端和服务器之间进行实时双向通信。WebSocket 协议最初由 RFC 6455 定义,并已被广泛应用于实时数据交换、聊天应用、实时游戏等多种场景。

WebSocket 的特点

  1. 全双工通信:客户端和服务器可以同时发送和接收数据。
  2. 低延迟:相比于轮询或长轮询等技术,WebSocket 的延迟更低。
  3. 持久连接:一旦建立连接,就可以一直保持连接状态,直到一方主动关闭连接。
  4. 高效的数据传输:数据传输格式灵活,可以是文本或二进制数据。

WebSocket 的工作流程

  1. 握手:客户端通过HTTP请求发起WebSocket连接,服务器响应并完成握手过程。
  2. 通信:握手完成后,客户端和服务器可以通过WebSocket进行实时双向通信。
  3. 关闭:任一方可以主动关闭连接。

WebSocket 的握手过程

握手过程是通过HTTP升级请求完成的。客户端发送一个特殊的HTTP请求,服务器响应并完成握手。

握手请求

客户端发送一个带有特定头部的HTTP请求:

plaintext
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

握手响应

服务器响应一个带有特定头部的HTTP响应:

plaintext
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

WebSocket API

WebSocket API 提供了几个主要的方法和事件,用于管理和处理WebSocket连接。

创建WebSocket对象

javascript
const socket = new WebSocket('ws://localhost:8080/chat');

WebSocket的状态

WebSocket 对象有四个状态:

  • CONNECTING (0) :正在连接。
  • OPEN (1) :连接已建立,可以进行通信。
  • CLOSING (2) :连接正在关闭。
  • CLOSED (3) :连接已关闭或尚未打开。

WebSocket的主要方法和事件

  • onopen:连接成功打开时触发。
  • onmessage:接收到消息时触发。
  • onerror:发生错误时触发。
  • onclose:连接关闭时触发。
  • send(data) :向服务器发送数据。
  • close() :关闭连接。

示例代码

下面是一个简单的WebSocket客户端和服务器的示例。

客户端示例

html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>WebSocket Client</title>
</head>
<body>
  <input type="text" id="message" placeholder="Type a message...">
  <button onclick="sendMessage()">Send</button>
  <ul id="messages"></ul>

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

    socket.addEventListener('open', (event) => {
      console.log('WebSocket connection opened:', event);
    });

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

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

    socket.addEventListener('close', (event) => {
      console.log('WebSocket connection closed:', event);
    });

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

服务器端示例(Node.js)

javascript
const WebSocket = require('ws');

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

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

  ws.on('close', () => {
    console.log('WebSocket connection closed');
  });

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

console.log('WebSocket server is running on port 8080');

总结

WebSocket 是一种高效的实时通信协议,广泛应用于多种场景,如实时数据交换、聊天应用、实时游戏等。通过合理的配置和使用,可以显著提升应用的实时性和用户体验。

希望这些示例和说明对你有所帮助!如果有更多问题或需要进一步的帮助,请随时提问。