WebSocket 与 SSE 对比:即时通信的选择(一)
在现代 Web 开发中,实时通信需求越来越多,比如聊天应用、实时通知、直播弹幕、股票行情推送等。实现这些需求的常见技术有 WebSocket 和 SSE(Server-Sent Events),但它们各有优缺点,适用于不同的场景。本文将详细介绍 WebSocket 和 SSE,并进行对比分析,帮助你选择合适的技术方案。
1. WebSocket 介绍
WebSocket 是 HTML5 引入的 全双工通信协议,允许客户端和服务器之间保持持久连接,实现低延迟的双向通信。
WebSocket 特点
全双工通信:客户端和服务器都可以主动发送数据。 低延迟:连接建立后,数据交换无需额外的 HTTP 头部,提高通信效率。 支持二进制数据:可以发送文本(JSON)和二进制数据(Blob、ArrayBuffer)。 需要握手:使用 HTTP 进行 Upgrade: websocket
协商,建立 WebSocket 连接。
适用场景
在线聊天应用(如 IM) 实时游戏(如在线对战) 股票行情推送 直播弹幕
示意图:
2. SSE(Server-Sent Events)介绍
SSE 是基于 HTTP 的 服务器推送技术,允许服务器主动向客户端发送数据,但客户端无法主动向服务器发送消息。
SSE 特点
单向通信:仅服务器可以推送数据,客户端不能主动发送。 基于 HTTP/1.1 长连接:使用 EventSource
监听服务器的推送数据。 仅支持文本传输:只能传输 UTF-8 编码的文本,不支持二进制数据。 自动重连:浏览器的 EventSource
组件自带断线重连功能。
适用场景
新闻或社交媒体的实时更新 服务器通知推送(如系统消息) 监控数据流(如服务器日志监控)
示意图: [SSE 数据交互示意图]
3. WebSocket 与 SSE 对比
特性 | WebSocket | SSE(Server-Sent Events) |
---|---|---|
通信模式 | 双向通信 | 单向(服务器 → 客户端) |
协议 | 独立协议(ws/wss) | HTTP(基于 HTTP/1.1 长连接) |
数据格式 | 文本 & 二进制 | 仅支持文本(UTF-8) |
连接方式 | 需升级 HTTP 连接 | 直接使用 HTTP 长连接 |
自动重连 | 需要手动实现 | EventSource 自带重连 |
浏览器支持 | 现代浏览器都支持 | 现代浏览器都支持(IE 不支持) |
适用场景 | 聊天、游戏、实时数据同步 | 服务器通知、新闻推送、状态更新 |
4. 选择 WebSocket 还是 SSE?
需要双向通信(如聊天、多人协作、游戏):选择 WebSocket 仅需服务器推送数据(如新闻推送、日志监控):选择 SSE 需要传输二进制数据:选择 WebSocket 希望自动重连且不想手动管理连接:选择 SSE
5. WebSocket 和 SSE 代码示例
WebSocket 示例
服务器(FastAPI + WebSocket)
from fastapi import FastAPI, WebSocket app = FastAPI() @app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"你发送了: {data}")
客户端(JavaScript)
const socket = new WebSocket("ws://localhost:8000/ws"); socket.onopen = () => {
console.log("WebSocket 连接已建立");
socket.send("Hello Server");
}; socket.onmessage = (event) => {
console.log("收到消息: ", event.data);
};
SSE 示例
服务器(FastAPI + SSE)
from fastapi import FastAPI
from starlette.responses import StreamingResponse
import asyncio app = FastAPI() async def event_generator():
while True:
yield f"data: {await asyncio.sleep(1, result='Hello, SSE!')}\n\n" @app.get("/events")
async def sse_endpoint():
return StreamingResponse(event_generator(), media_type="text/event-stream")
客户端(JavaScript)
const eventSource = new EventSource("http://localhost:8000/events"); eventSource.onmessage = (event) => {
console.log("收到推送: ", event.data);
}; eventSource.onerror = () => {
console.log("SSE 连接异常");
};
6. 总结
WebSocket 更强大,适用于需要双向实时交互的场景,但需要额外的连接管理。
SSE 更简单,适用于服务器单向推送的场景,且支持自动重连,但不支持二进制数据。
如果你的应用需要实时通信,并且只需要服务器推送数据,SSE 是更简单的选择。但如果你需要双向交互或二进制数据支持,WebSocket 更合适。
WebSocket 与 SSE 对比:即时通信的选择(一)的更多相关文章
- WebSocket实现Web端即时通信
前言 WebSocket 是HTML5开始提供的一种在浏览器和服务器间进行全双工通信的协议.目前很多没有使用WebSocket进行客户端服务端实时通信的web应用,大多使用设置规则时间的轮询,或者使用 ...
- 推荐一个 基于 WebSocket 和 Redis 的 即时通信 开源项目
项目地址 : https://github.com/2881099/im 大家可以和 SignalR 比较看看 , 如何 ? ^^ ^^ ^^ 这是一个 网友 写的 , 他还写了 ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- 即时通信WebSocket 和Socket.IO
WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...
- .NET 即时通信,WebSocket服务端实例
即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...
- WebSocket实现web即时通信(后端nodejs实现)
WebSocket实现web即时通信 一.首先看一下,HTTP.ajax轮询.long poll和WebSocket的区别: 1.HTTP 协议(短连接):一个 Request 一个 Response ...
- .NET实现WebSocket服务端即时通信实例
即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...
- .NET 即时通信,WebSocket
.NET 即时通信,WebSocket 即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s ...
- Ajax、Comet、Websocket、SSE
从 http 协议说起 1996年IETF HTTP工作组发布了HTTP协议的1.0版本 ,到现在普遍使用的版本1.1,HTTP协议经历了17 年的发展.这种分布式.无状态.基于TCP的请求/响应式 ...
- (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案
一.前言.提出问题 公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让 ...
随机推荐
- AGC002E题解
简要题意 桌上有 \(n\) 堆糖果,第 \(i\) 堆糖果有 \(a_i\) 个糖.两人在玩游戏,轮流进行,每次进行下列两个操作中的一个: 将当前最大的那堆糖果全部吃完: 将每堆糖果吃掉一个: 吃完 ...
- ChatBI≠NL2SQL:关于问数,聊聊我踩过的坑和一点感悟
"如果说数据是新时代的石油,智能问数就是能让普通人也能操作的智能钻井平台." 这里是**AI粉嫩特攻队!** ,这段时间真的太忙了,不过放心,关于从零打造AI工具的coze实操下篇 ...
- My'Bug
修改时未校验工作经历是否为空
- antd+vue 中select组件的自定义后缀图标不显示问题记录
根据项目需求,需要使用select组件,并自定义后缀图标,但是设置了没的效果,这是我的代码和效果图 后来查看代码发现需要给select组件加上showArrow属性,然后实现了效果,看效果图 这里记录 ...
- 【面试题】实现 queryParse 函数,完成解析 URL 参数的功能
问题:实现 queryParse 函数,完成解析 URL 参数的功能 /** * 问题:实现 queryParse 函数,完成解析 URL 参数的功能 * * 用法: * ```js * const ...
- JMeter 线程编号 __threadNum 获取不到
场景: 在 BeanShell PreProcessor 中,使用 vars.get("__threadNum") 获取不到当前线程数,如: import org.apache.j ...
- 【WPF开发】HandyControl Growl控件Error通知不自动消失的问题
需求 HandyControl Growl在Error类型的通知不自动消失,此时需要他跟其他的统一. 找寻原因 那么翻翻代码看看为啥不消失呗 1.这是决定关闭通知的计时器 2.这是通过_staysOp ...
- 张高兴的大模型开发实战:(三)使用 LangGraph 为对话添加历史记录
目录 基础概念 环境搭建与配置 将对话历史存储至内存 将对话历史存储至 PostgreSQL 在构建聊天机器人时,对话历史记录是提升用户体验的核心功能之一,用户希望机器人能够记住之前的对话内容,从而避 ...
- Ubuntu下Ibus和fcitx的奇葩问题
最近装了个Ubuntu,捉鸡的输入法令人哀伤. 于是乎,卸载了自带Ibus和fcitx出现各种问题,留爪. 首先,卸载了Ibus,会出现的问题如下: 注销/重启系统有问题 系统设置菜单选项缺失 -&g ...
- 图像处理中的 Gaussina Blur 和 SIFT 算法
Gaussina Blur 高斯模糊 高斯模糊的数学定义 高斯模糊是通过 高斯核(Gaussian Kernel) 对图像进行卷积操作实现的. 二维高斯函数定义为 \[G(x, y, \sigma) ...