在现代 Web 开发中,实时通信需求越来越多,比如聊天应用、实时通知、直播弹幕、股票行情推送等。实现这些需求的常见技术有 WebSocketSSE(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 对比:即时通信的选择(一)的更多相关文章

  1. WebSocket实现Web端即时通信

    前言 WebSocket 是HTML5开始提供的一种在浏览器和服务器间进行全双工通信的协议.目前很多没有使用WebSocket进行客户端服务端实时通信的web应用,大多使用设置规则时间的轮询,或者使用 ...

  2. 推荐一个 基于 WebSocket 和 Redis 的 即时通信 开源项目

    项目地址 : https://github.com/2881099/im 大家可以和 SignalR 比较看看 ,  如何  ?        ^^  ^^  ^^ 这是一个 网友 写的 , 他还写了 ...

  3. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  4. 即时通信WebSocket 和Socket.IO

    WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...

  5. .NET 即时通信,WebSocket服务端实例

    即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...

  6. WebSocket实现web即时通信(后端nodejs实现)

    WebSocket实现web即时通信 一.首先看一下,HTTP.ajax轮询.long poll和WebSocket的区别: 1.HTTP 协议(短连接):一个 Request 一个 Response ...

  7. .NET实现WebSocket服务端即时通信实例

    即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...

  8. .NET 即时通信,WebSocket

    .NET 即时通信,WebSocket 即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s ...

  9. Ajax、Comet、Websocket、SSE

    从 http 协议说起 1996年IETF  HTTP工作组发布了HTTP协议的1.0版本 ,到现在普遍使用的版本1.1,HTTP协议经历了17 年的发展.这种分布式.无状态.基于TCP的请求/响应式 ...

  10. (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案

    一.前言.提出问题 公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让 ...

随机推荐

  1. Web前端入门第2问:前端开发是什么?与后端、全栈的区别是什么?一个完整的Web项目有哪些角色参与?

    一个完整的Web项目有哪些角色参与? 提出需求(这一步可以是甲方,也可以是用户) 需求分析,画出原型图(产品经理) 根据原型图输出 UI 界面及交互图(UI/UX设计师) 根据UI及交互效果画出页面, ...

  2. linux shell用expect实现在scp时自动输入密码

    文章目录 linux shell用expect自动输入密码 按行读取文件 expect 其他 linux shell用expect自动输入密码 最近有东西需要部署到很多服务器上去,一个服务器一个服务器 ...

  3. 迅速理解 LCS 最长公共子序列问题

    在算法与数据结构的经典问题中,最长公共子序列(Longest Common Subsequence,简称 LCS)问题占据着重要的地位.给定两个序列,我们需要找到它们最长的公共子序列,而子序列要求保持 ...

  4. [tldr] vscode的remote插件的config文件内容解析

    参考VS Code Remote SSH配置 解决了什么问题 vscode的remote插件可以直接通过可视化的UI新建一个连接 通过ssh指令添加服务器的连接方式 但是这种方式添加的服务器名字等于服 ...

  5. RSA算法详解及相关数学原理解析

    RSA算法详解及相关数学原理解析 前言 ‍ 为了记录自己学习密码学的过程,也是为了便于个人应付相关课程的考核,故写此博客. 本博客总结了怎么用C++手搓一个RSA算法,以及补补欠缺的一些数学知识和可能 ...

  6. 第十八届全国大学生信息安全竞赛暨第二届“长城杯”铁人三项赛web方向部分wp

    第十八届全国大学生信息安全竞赛暨第二届"长城杯"铁人三项赛web方向部分wp hello_web 查看源代码发现有两个文件,访问一下 Tips是phpinfo 里面可以看到disa ...

  7. Jenkins合并代码Git报错处理过程

    #jenkins合并代码时候报错内容#10:36:08 ! [rejected] HEAD -> master (non-fast-forward)#10:36:08 error: failed ...

  8. 【JDBC第1章】JDBC概述

    第1章:JDBC概述 1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以 ...

  9. 【SpringMVC】RESTful CRUD

    RESTful CRUD REST:即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方 ...

  10. springmvc实现转发和重定向

    一. @RequestMapping("/testVoid") public String testVoid(HttpServletRequest request){ //转发方式 ...