(六)前端,如此简单!--- 三类通讯

一、EventSource 浏览器实时通信

EventSource 也是sse(Server-Sent Events)单向通讯,服务器到客户端

客户端只能接收,支持断线重连和事件 ID 追踪。

复制代码
// 创建 EventSource 连接
const eventSource = new EventSource('/api/events');		// 基于 HTTP 协议,浏览器会自动补全相对路径(http:// 或 https://)

// 监听默认消息,只能接收文本数据
eventSource.onmessage = (event) => {
  console.log('收到消息:', event.data);
};

// 监听打开连接
eventSource.onopen = () => {
  console.log('连接已建立');
};

// 监听错误,原生支持自动重连
eventSource.onerror = (err) => {
  console.log('连接断开,正在尝试重连...');
};

// 关闭连接,只能重新 new EventSource() 建立连接。
eventSource.close();

// EventSource API 本身没有 onclose 事件

二、WebSocket双向全双工通信

客户端和服务器都能主动发送消息,建立连接后保持长连接。没有自动重连。

  • 客户端发起 HTTP 请求,携带 Upgrade: websocketConnection: Upgrade 头。

  • 服务器同意升级,返回 101 Switching Protocols 状态码。

  • 连接保持打开,双方可随时发送数据。

    // 创建 WebSocket 连接
    const webSocket = new WebSocket('ws://localhost:3000/chat'); // 基于 WebSocket 协议,自动补全 ws:// 或 wss://

    webSocket.onopen=(events)=>{
    console.log('WebSocket 连接已建立');
    };

    webSocket.onmessage=(events)=>{
    console.log("收到信息",events.data);
    };
    // 也可以发送消息
    webSocket.send("客户端消息");

    webSocket.onerror=(events)=>{
    console.error('WebSocket 错误:', events);
    };

    webSocket.close();

    webSocket.onclose=(events)=>{
    console.error('WebSocket 连接已关闭:', events);
    };

    send() 方法可以发送以下类型的数据:
    String 'hello' 文本消息(最常用)
    Blob new Blob([...]) 二进制大对象
    ArrayBuffer new ArrayBuffer(8) 原始二进制数据
    TypedArray new Uint8Array([1,2,3]) 类型化数组(Int8Array, Uint8Array 等)

    // 接收二进制数据的格式,需要设置
    ws.binaryType = 'arraybuffer'; // 默认 'blob',可选 'arraybuffer'

三、BroadcastChannel 广播机制

同一浏览器内通信,用于多标签页数据同步,不经过网络,完全本地。可以发送任意可序列化数据(通过结构化克隆算法)

浏览器内部维护了一个频道注册表,所有使用相同名称创建的 BroadcastChannel 实例都会自动关联到同一个逻辑频道。

一对多消息分发,不会发送给自己。

复制代码
// 页面1
const channel = new BroadcastChannel('cart_channel');
channel.postMessage({ action: 'add', product: { id: 1, name: '商品A' } });

// 页面2、3、4... 所有同源且加入同一频道的页面都会收到
const channel = new BroadcastChannel('cart_channel');
channel.onmessage = (event) => {
	console.log('所有页面同步更新购物车:', event.data);
};

channel.close() //释放资源,避免内存泄漏。
相关推荐
Jinuss2 小时前
源码分析之React中副作用Effect全流程
前端·javascript·react.js
踩着两条虫2 小时前
VTJ.PRO 在线应用开发平台的低代码引擎与DSL系统
前端·低代码·ai编程
Yiyaoshujuku2 小时前
医院API接口,从医院真实世界数据HIS、LJS、EMR、PACS系统到医院药品流向数据....
大数据·前端·人工智能
Shirley~~3 小时前
力扣hot100:相交链表
前端·算法
Jay叶湘伦3 小时前
【极简】用 Vue 写一个 ChatGPT 前端应用,支持连续对话、Markdown 渲染与本地记忆
前端·vue.js·chatgpt
大家的林语冰3 小时前
《前端周刊》尤大官宣 Vite 8 稳定版首发!npm 新官网?React 官网更新。focusgroup 新功能!
前端·javascript·vite
kuuailetianzi3 小时前
构建企业级督办任务系统:Vue3 + TypeScript 实战(多级任务拆解+批量操作+进度追踪+单元格合并)
前端·javascript·typescript
Hilaku3 小时前
王自如公开招聘全栈前端,要求有多离谱?
前端·javascript·ai编程
大漠_w3cpluscom3 小时前
CSS 技巧:CSS 中选择 html 元素的各种奇技淫巧
前端·css·weui