深入理解javascript的 WebSocket详解、封装、使用案例

86 阅读2分钟

WebSocket 提供了全双工通信机制,允许服务器主动发送信息给客户端。与传统的 HTTP 协议相比,WebSocket 可以减少通信握手的次数,提高性能,适用于需要实时数据传输的场景,比如聊天应用、游戏、股票价格更新等。

基本概念

  • 全双工通信:客户端和服务器可以同时发送数据,不需要等待对方的响应。
  • 持久连接:一旦建立 WebSocket 连接,它会一直保持连接状态,直到客户端或服务器关闭连接。

WebSocket API

1. 建立连接

const socket = new WebSocket('wss://example.com/path');
  • wss:// 是 WebSocket 安全协议(WebSocket Secure),类似于 HTTPS。

2. 事件处理

WebSocket 对象会触发几个事件,你可以监听这些事件来处理连接的打开、接收消息、错误和关闭。

socket.addEventListener('open', (event) => {
  // 连接打开后,可以发送数据
  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('WebSocket connection closed:', event.code, event.reason);
});

3. 发送和接收数据

可以发送字符串或二进制数据。

// 发送字符串
socket.send('Hello WebSocket');

// 发送二进制数据
const binaryData = new Uint8Array([0, 1, 2, 3]);
socket.send(binaryData);

4. 关闭连接

socket.close();

封装 WebSocket

封装 WebSocket 可以创建一个通用的类或函数,方便在不同的项目中复用。

class WebSocketClient {
  constructor(url) {
    this.socket = new WebSocket(url);
    this.initEventListeners();
  }

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

    this.socket.addEventListener('message', (message) => {
      this.onMessage(message);
    });

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

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

  onMessage(message) {
    // 可以在这里处理接收到的消息
    console.log('Received message:', message.data);
  }

  send(data) {
    if (this.socket.readyState === WebSocket.OPEN) {
      this.socket.send(data);
    } else {
      console.error('WebSocket is not connected');
    }
  }

  close() {
    this.socket.close();
  }
}

使用案例

聊天应用

const chatSocket = new WebSocketClient('wss://example.com/chat');

// 发送消息
chatSocket.send('Hello, this is a message to the server!');

// 处理接收到的消息
chatSocket.onMessage = (message) => {
  // 更新 UI,显示消息等
};

实时数据更新

const dataSocket = new WebSocketClient('wss://example.com/data');

// 当接收到股票价格更新时
dataSocket.onMessage = (message) => {
  const stockData = JSON.parse(message.data);
  // 使用最新的股票价格更新 UI
};

注意事项

  • 安全性:使用 wss:// 协议来加密 WebSocket 连接。
  • 后端支持:服务器必须支持 WebSocket 协议。
  • 心跳检测:定期发送心跳消息以保持连接活跃,防止因网络问题导致的连接中断。
  • 错误处理:妥善处理连接错误和断开连接的情况。

WebSocket 是实现实时通信的强大工具,但也需要考虑安全性、稳定性和用户体验。通过封装 WebSocket,可以创建易于维护和重用的代码,以适应不同的应用场景。

我的博客只写前端博文,点击我去看更多喜欢的前端博文,欢迎大家一起讨论学习!【https://blog.csdn.net/qq_29101285?spm=1011.2266.3001.5343】