当前位置: 首页 > news >正文

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

1 websocket 核心

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

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

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 方案 ,敬请期待!

http://www.lqws.cn/news/441307.html

相关文章:

  • SQL注入安全研究
  • JMeter 高阶玩法:分布式压测的技术核心技术要点
  • 容器运行时保护:用Falco构建云原生安全防线
  • Java同步机制四大工具对比
  • 国产USRP X440 PRO:超大带宽、多通道相参同步的旗舰型软件无线电设备
  • 自主学习-《WebDancer:Towards Autonomous Information Seeking Agency》
  • leetcode:461. 汉明距离(python3解法,数学相关算法题)
  • 中国医科大借iMeta影响因子跃升至33.2(中科院1区)东风,凭多组学联合生信分析成果登刊
  • 视觉大语言模型未能充分利用视觉表征
  • Oracle 中唯一索引对行锁的影响
  • 工具 | vscode 发出声音,如何关闭
  • Uniapp 网络请求封装专题
  • 使用Charles抓包工具提升API调试与性能优化效率
  • 【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
  • 从“看懂”到“行动”: VLM 与 VLA
  • MySQL读写分离技术详解:架构设计与实践指南
  • Hive优化详细讲解
  • vue项目插入腾讯地图
  • Umi + qiankun 微前端架构
  • Python爬虫(七):PySpider 一个强大的 Python 爬虫框架
  • SQL分片工具类
  • 动态规划:砝码称重(01背包-闫氏DP分析法)
  • 性能优化中的工程化实践:从 Vite 到 Webpack 的最佳配置方案
  • Day05_数据结构总结Z(手写)
  • 386. 字典序排数
  • 解码成都芯谷金融中心:文化科技产业园的产融创新生态密码
  • 2025年八大科技趋势
  • Spring Boot + MyBatis + Vue:构建高效全栈应用的实战指南
  • bos_token; eos_token; pad_token是什么
  • 农村土地经营权二轮延包—一键生成属性数据库MDB