前端跨域解决方案(5):websocket

发布于:2025-06-22 ⋅ 阅读:(19) ⋅ 点赞:(0)

1 websocket 核心

WebSocket 是一种基于 TCP 协议的全双工通信协议,在浏览器与服务器间建立持久连接,实现实时数据交互。与传统 HTTP 协议相比,具有以下核心优势:

特性对比 HTTP 1.1 WebSocket
通信模式 请求 - 响应(单向) 全双工(双向)
连接特性 短连接(每次请求重建) 长连接(一次握手,持续通信)
实时性 依赖轮询或长轮询 即时推送
协议开销 每次请求携带完整头部 初始握手后仅需极小帧头
二进制支持 需额外处理 原生支持

1.1 websocket 基本使用方法

1.1.1 创建 WebSocket 连接

首先,你需要在浏览器端创建一个新的 WebSocket 对象,向其传入你想要连接的服务器的 WebSocket 地址。

// 创建 WebSocket 实例(ws:// 非加密,wss:// 加密)
let socket = new WebSocket('ws://www.example.com/socketserver');

1.1.2 处理连接事件

 你可以监听几个重要的事件,例如 openmessageerror 和 close

  • 当 WebSocket 连接成功时,open 事件将会被触发。

  • 当从服务器收到数据时,message 事件将会被触发。

  • 当发生错误时,error 事件将会被触发。

  • 当连接关闭时,close 事件将会被触发。

socket.onopen = function(event) {
  console.log('Connection open');
};

socket.onmessage = function(event) {
  console.log('Received data: ' + event.data);
};

socket.onerror = function(error) {
  console.log('Error detected: ' + error);
};

socket.onclose = function(event) {
  console.log('Connection closed');
};

1.1.3 发送和接收数据

通过 WebSocket 连接,你可以使用 send 方法发送数据到服务器,服务器也可以随时发送数据到客户端。

// 发送文本消息
socket.send('Hello, server!');

// 发送 JSON 数据
socket.send(JSON.stringify({ action: 'login', user: 'doubao' }));

// 接收并解析 JSON
socket.addEventListener('message', (event) => {
  try {
    const data = JSON.parse(event.data);
    console.log('解析后的数据:', data);
  } catch (e) {
    console.log('原始文本数据:', event.data);
  }
});

1.1.4 关闭连接

 当你不再需要 WebSocket 连接时,应当关闭它,以释放资源。

/ 主动关闭连接(状态码可选,默认 1000 表示正常关闭)
socket.close(1000, '用户主动退出');

// 检测连接状态
if (socket.readyState === WebSocket.OPEN) {
  socket.send('当前连接正常');
}

2. 实战案例

2.1 服务端A(servera.js)

// 引入 Express 框架
const express = require('express');
// 创建一个 Express 应用
const app = express();
// 设置静态文件夹
app.use(express.static('public'));
// 定义监听端口
const port = 3000;
// 让应用监听在指定端口并在控制台输出信息
app.listen(port, () => {
    // 当服务器开始运行时,打印一条消息
    console.log(`Server is running on http://localhost:${port}`);
});

2.2 静态页面A(a.html)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebSocket 客户端示例</title>
</head>
<body>
  <script>
    // 创建 WebSocket 连接
    const socket = new WebSocket('ws://localhost:4000');
    
    // 连接成功时发送消息
    socket.onopen = () => {
      console.log('WebSocket 连接已建立');
      socket.send('hello');
    };
    
    // 接收服务器消息
    socket.onmessage = (event) => {
      console.log(`收到消息: ${event.data}`);
    };
    
    // 错误处理
    socket.onerror = (error) => {
      console.error('WebSocket 错误:', error);
    };
    
    // 连接关闭时重连
    socket.onclose = () => {
      console.log('连接已关闭,尝试重连...');
      setTimeout(() => {
        // 实际应用中应实现指数退避重连策略
        new WebSocket('ws://localhost:4000');
      }, 3000);
    };
  </script>
</body>
</html>

2.3 服务端B(serverb.js)

// serverb.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 4000 });

// 客户端连接管理
wss.on('connection', (ws) => {
  console.log('新客户端已连接');
  
  // 接收客户端消息
  ws.on('message', (message) => {
    console.log(`收到消息: ${message}`);
    
    // 响应客户端
    ws.send('world');
  });
  
  // 连接关闭
  ws.on('close', () => {
    console.log('客户端连接已关闭');
  });
  
  // 错误处理
  ws.on('error', (error) => {
    console.error('WebSocket 连接错误:', error);
  });
});

console.log('WebSocket 服务器运行中:ws://localhost:4000');

3 适用场景

场景类型 具体案例 技术优势
实时通信 在线聊天、客服系统 低延迟、双向通信
协作工具 多人文档编辑、实时白板 状态同步、操作即时反馈
实时数据监控 股票行情、物联网监控 数据推送、多客户端同步
游戏应用 网页游戏、多人在线游戏 低延迟、高并发处理
通知系统 新闻推送、系统通知 服务器主动推送、减少轮询开销

WebSocket 作为现代实时 Web 应用的基础设施,已广泛应用于社交、金融、工业监控等领域。

下一章将介绍 Nginx 方案 ,敬请期待!