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两个人分别在不同的地点,能不能实现这样的功能,让 ...
随机推荐
- Web前端入门第 10 问:HTML 段落标签( <p> )嵌套段落标签( <p> )的渲染结果会怎样?
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 曾经有一个神奇的 bug 摆在我面前,为什么套娃一样的 HTML 语法,在段落标签 <p> 身上不生 ...
- 边缘检测及Canny算法
对边缘的直观理解 边缘有助于我们对图像进行语义理解.直观上,边缘发生在图像强度值变化剧烈的地方 如何描述变化?自然是用导数/梯度 如上图,我们对图中的信号在水平方向上求导,可以得到右侧的导数图像,可以 ...
- MySQL-SQL调优-引擎选错索引或者不使用索引分析 和 字符串加索引的方式思考
优化器生成最优执行计划需要考虑的因素 MySQL有一个优化器,专门负责生成最优的查询计划,生成最优查询计划可能考虑的因素有: 扫描行数 是否排序 是否需要回表 是否需要临时表 等等 在不同的因素作用下 ...
- 代码块--java进阶day03
1.代码块 1.局部代码块 定义在方法中的一对大括号,可以提早释放内存,走完{}里的逻辑后就会被释放,在之后的编程中无法使用 2.构造代码块 位置在类中,方法外的{},在构造方法执行的时候,构造代码块 ...
- 初识if,if的三种结构
1.if语句 流程控制语句:通过一语句,来控制程序的执行流程.其中if属于分支结构 2.if语句的第一种格式 . 实操: 3.if的第二种格式 实操: 4.if的第三种格式 实操: 5.注意事项 在i ...
- Sql语句:条件限制语句
where select sname,sdept,sage from student where ssex = '男' or ssex = '女' and sage not between 20 an ...
- 【QT】Linux下安装QT开发环境
Linux下安装QT开发环境 零.下载安装包 从以下网址可以下载QT的所有版本: https://download.qt.io/ 这次演示安装5.9.0版本,因为是长期支持的版本,所以进入到archi ...
- Zephyr重定向日志打印到USB串口
nRF52840DK开发板的例程大多数是从硬件串口打印日志,然后硬件串口在开发板上通过Jlink转换为USB串口,最后打印到电脑上. 这里给出通过52840自己的USB串口打印日志的方法. 以zeph ...
- c#生成一个某文本中不包含的随机字符串
//生成一个某文本中不包含的随机字符串 private static string GetRandomStr(string allStr) { int number; string resStr; d ...
- Linux centos8 VPS基本配置之SSH
Linux centos8 VPS基本配置之SSH 最近在使用阿里云的时候,需要安装一些nodejs模块,但是总是安装失败,我已经使用了淘宝镜像cnpm加速,查看了具体原因是有github的依赖. 阿 ...