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

一、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: websocket 和 Connection: 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() //释放资源,避免内存泄漏。
相关推荐
Agent世界3 分钟前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript
FungLeo4 分钟前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
某哈压力大22 分钟前
SSH 突然 Connection reset?不是密钥坏了,是 OpenSSL 把 sshd 干趴了
前端·node.js·命令行
程序员大阳25 分钟前
副队长ES6+教程(3)--解构赋值
前端·javascript·es6·赋值·解构
神膘护体小月半42 分钟前
css - 元素背景图由 hover 触发,初次加载时闪动的解决办法
前端·javascript·css
程序员大阳1 小时前
副队长ES6+教程(2)--let 与 const
前端·javascript·es6·const·let·var
deli0071 小时前
写满 200GB 后 SSD 为什么掉到 95MB/s?SLC 缓存模型实测
前端
曦樂~2 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
deli0072 小时前
HTTPS 的锁是怎么挂上的?TLS 1.3 握手 6 步实测
前端
程序员大阳2 小时前
副队长ES6+教程(1)--ES6+初识
前端·ecmascript·es6