网易首页 > 网易号 > 正文 申请入驻

你还在使用 WebSocket 实现实时消息推送吗?

0
分享至

来源:市场资讯

(来源:macrozheng)


前言

在日常的开发中,我们经常能碰见服务端需要主动推送给客户端数据的业务场景,比如数据大屏的实时数据,比如消息中心的未读消息,比如聊天功能等等。

本文主要介绍SSE的使用场景和如何使用SSE。


服务端向客户端推送数据的实现方案有哪几种?

我们常规实现这些需求的方案有以下三种

  1. 轮询

  2. websocket

  3. SSE

轮询简介

在很久很久以前,前端一般使用轮询来进行服务端向客户端进行消息的伪推送,为什么说轮询是伪推送?因为轮询本质上还是通过客户端向服务端发起一个单项传输的请求,服务端对这个请求做出响应而已。通过不断的请求来实现服务端向客户端推送数据的错觉。并不是服务端主动向客户端推送数据。显然,轮询一定是上述三个方法里最下策的决定。

轮询的缺点:

  1. 首先轮询需要不断的发起请求,每一个请求都需要经过http建立连接的流程(比如三次握手,四次挥手),是没有必要的消耗。

  2. 客户端需要从页面被打开的那一刻开始就一直处理请求。虽然每次轮询的消耗不大,但是一直处理请求对于客户端来说一定是不友好的。

  3. 浏览器请求并发是有限制的。比如Chrome 最大并发请求数目为 6,这个限制还有一个前提是针对同一域名的,超过这一限制的后续请求将会被阻塞。而轮询意味着会有一个请求长时间的占用并发名额。

  4. 而如果轮询时间较长,可能又没有办法非常及时的获取数据

websocket简介

websocket是一个双向通讯的协议,他的优点是,可以同时支持客户端和服务端彼此相互进行通讯。功能上很强大。

缺点也很明显,websocket是一个新的协议,ws/wss。也就是说,支持http协议的浏览器不一定支持ws协议。

相较于SSE来说,websocket因为功能更强大。结构更复杂。所以相对比较重。

websocket对于各大浏览器的兼容性↓


SSE简介

sse是一个单向通讯的协议也是一个长链接,它只能支持服务端主动向客户端推送数据,但是无法让客户端向服务端推送消息。

长链接是一种HTTP/1.1的持久连接技术,它允许客户端和服务器在一次TCP连接上进行多个HTTP请求和响应,而不必为每个请求/响应建立和断开一个新的连接。长连接有助于减少服务器的负载和提高性能。

SSE的优点是,它是一个轻量级的协议,相对于websockte来说,他的复杂度就没有那么高,相对于客户端的消耗也比较少。而且SSE使用的是http协议(websocket使用的是ws协议),也就是现有的服务端都支持SSE,无需像websocket一样需要服务端提供额外的支持。

注意:IE大魔王不支持SSE

SSE对于各大浏览器的兼容性↓


注意哦,上图是SSE对于浏览器的兼容不是对于服务端的兼容。

websocket和SSE有什么区别?

轮询

对于当前计算机的发展来说,几乎很少出现同时不支持websocket和sse的情况,所以轮询是在极端情况下浏览器实在是不支持websocket和see的下策。

Websocket和SSE

我们一般的服务端和客户端的通讯基本上使用这两个方案。首先声明:这两个方案没有绝对的好坏,只有在不同的业务场景下更好的选择。

SSE的官方对于SSE和Websocket的评价是

  1. WebSocket是全双工通道,可以双向通信,功能更强;SSE是单向通道,只能服务器向浏览器端发送。

  2. WebSocket是一个新的协议,需要服务器端支持;SSE则是部署在HTTP协议之上的,现有的服务器软件都支持。

  3. SSE是一个轻量级协议,相对简单;WebSocket是一种较重的协议,相对复杂。

  4. SSE默认支持断线重连,WebSocket则需要额外部署。

  5. SSE支持自定义发送的数据类型。

Websocket和SSE分别适用于什么业务场景?

对于SSE来说,它的优点就是轻,而且对于服务端的支持度要更好。换言之,可以使用SSE完成的功能需求,没有必要使用更重更复杂的websocket。

比如:数据大屏的实时数据,消息中心的消息推送等一系列只需要服务端单方面推送而不需要客户端同时进行反馈的需求,SSE就是不二之选。

对于Websocket来说,他的优点就是可以同时支持客户端和服务端的双向通讯。所适用的业务场景:最典型的就是聊天功能。这种服务端需要主动向客户端推送信息,并且客户端也有向服务端推送消息的需求时,Websocket就是更好的选择。

SSE有哪些主要的API?

var source = new EventSource(url);

SSE连接状态

source.readyState

  • 0,相当于常量EventSource.CONNECTING,表示连接还未建立,或者连接断线。

  • 1,相当于常量EventSource.OPEN,表示连接已经建立,可以接受数据。

  • 2,相当于常量EventSource.CLOSED,表示连接已断,且不会重连。

SSE相关事件

  • open事件(连接一旦建立,就会触发open事件,可以定义相应的回调函数)

  • message事件(收到数据就会触发message事件)

  • error事件(如果发生通信错误(比如连接中断),就会触发error事件)

数据格式

Content-Type: text/event-stream //文本返回格式Cache-Control: no-cache  //不要缓存Connection: keep-alive //长链接标识


显然,如果直接看api介绍不论是看这里还是看官网,大部分同学都是比较懵圈的状态,那么我们写个demo来看一下?


demo请看下方


如何实操一个SSE链接?Demo↓

这里Demo前端使用的就是最基本的html静态页面连接,没有使用任何框架。 后端选用语言是node,框架是Express。

理论上,把这两段端代码复制过去跑起来就直接可以用了。

  1. 第一步,建立一个index.html文件,然后复制前端代码Demo到index.html文件中,打开文件

  2. 第二步,进入一个新的文件夹,建立一个index.js文件,然后将后端Demo代码复制进去,然后在该文件夹下执行

npm init          //初始化npmnpm i express     //下载node express框架node index        //启动服务


在这一层文件夹下执行命令。

完成以上操作就可以把项目跑起来了

前端代码Demo

Document

后端代码Demo(node的express)

const express = require('express'); //引用框架const app = express(); //创建服务const port = 8088; //项目启动端口//设置跨域访问app.all("*", function(req, res, next) {//设置允许跨域的域名,*代表允许任意域名跨域res.header("Access-Control-Allow-Origin", '*');//允许的header类型res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");//跨域允许的请求方式res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");// 可以带cookiesres.header("Access-Control-Allow-Credentials", true);if (req.method == 'OPTIONS') {res.sendStatus(200);} else {next();app.get("/sse",(req,res) => {res.set({'Content-Type': 'text/event-stream', //设定数据类型'Cache-Control': 'no-cache',// 长链接拒绝缓存'Connection': 'keep-alive'//设置长链接console.log("进入到长连接了")//持续返回数据setInterval(() => {console.log("正在持续返回数据中ing")const data = {message: `Current time is ${new Date().toLocaleTimeString()}`res.write(`data: ${JSON.stringify(data)}\n\n`);}, 1000);//创建项目app.listen(port, () => {console.log(`项目启动成功-http://localhost:${port}`)

效果


总结

  1. SSE比websocket更轻

  2. SSE是基于http/https协议的

  3. websocket是一个新的协议,ws/wss协议

  4. 如果只需要服务端向客户端推送消息,推荐使用SSE

  5. 如果需要服务端和客户端双向推送,请选择websocket

  6. 不论是SSE还是websocket,对于浏览器的兼容性都不错

  7. 轮询是下策,很占用客户端资源,不建议使用。(不过偷懒的时候他确实方便)

  8. IE不支持SSE

  9. 小白同学demo如果跑不明白可以私信我

对了,小程序不支持SSE哦

作者:工边页字
来源:juejin.cn/post/7325730345840066612

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
普京大动作:一边释放在俄关押4年多的前美军陆战队员,一边向日本“亮肌肉”

普京大动作:一边释放在俄关押4年多的前美军陆战队员,一边向日本“亮肌肉”

红星新闻
2026-08-13 15:44:09
举报郭德纲改红歌的人,你们是想看样板戏吗?

举报郭德纲改红歌的人,你们是想看样板戏吗?

评论员岳连
2026-08-13 13:45:50
朝鲜导弹顶到基辅鼻子底下,北约却连个屁都不敢放!这世界怎么了

朝鲜导弹顶到基辅鼻子底下,北约却连个屁都不敢放!这世界怎么了

浯江孤舟
2026-08-12 11:15:07
WTT瑞典大满贯:男单爆大冷!张本智和剃光头,林诗栋迎复仇战

WTT瑞典大满贯:男单爆大冷!张本智和剃光头,林诗栋迎复仇战

云上乌托邦
2026-08-13 15:21:50
iPhone Ultra 命名实锤:9月10日,即将上市!

iPhone Ultra 命名实锤:9月10日,即将上市!

科技堡垒
2026-08-13 09:12:16
百花奖花了6000万财政资金,市内接驳就花了180万  网友:不用办了

百花奖花了6000万财政资金,市内接驳就花了180万 网友:不用办了

小星球探索
2026-08-13 13:49:28
俄最重要粮食出口枢纽之一遭夜袭,黑海港口两码头瘫痪 俄:摧毁乌502架无人机

俄最重要粮食出口枢纽之一遭夜袭,黑海港口两码头瘫痪 俄:摧毁乌502架无人机

红星新闻
2026-08-13 13:05:24
弟弟举报哥哥冒用自己身份上大学,最新发声:从来没有想过报复哥哥,也没有针对他,有想过如果举报会毁了他,但先救自己的心更强烈

弟弟举报哥哥冒用自己身份上大学,最新发声:从来没有想过报复哥哥,也没有针对他,有想过如果举报会毁了他,但先救自己的心更强烈

大风新闻
2026-08-13 15:00:10
“活着没意思,想下去陪孩子”,入狱后屡次想轻生的她,被女子监狱拉住

“活着没意思,想下去陪孩子”,入狱后屡次想轻生的她,被女子监狱拉住

上观新闻
2026-08-13 11:42:54
林肯号上的5000人正在崩溃:7死斗殴、食物配给、跳海频发,美军为何装聋作哑?

林肯号上的5000人正在崩溃:7死斗殴、食物配给、跳海频发,美军为何装聋作哑?

新姐看世界
2026-08-13 15:09:27
突然才发现:凡是家里出学霸的家庭,爸爸都有同一个特点,太准了

突然才发现:凡是家里出学霸的家庭,爸爸都有同一个特点,太准了

户外阿毽
2026-08-13 00:24:11
WTT大满贯乱了!头号种子爆冷出局,国乒男单第3人淘汰,真打不过

WTT大满贯乱了!头号种子爆冷出局,国乒男单第3人淘汰,真打不过

侃球熊弟
2026-08-13 19:22:04
无解的阳谋!乌克兰彻底傻眼,普京做梦也没想到金正恩会用这招

无解的阳谋!乌克兰彻底傻眼,普京做梦也没想到金正恩会用这招

奥利奥变薄了的
2026-08-13 15:34:49
“保本神器”,亏得比股票还狠

“保本神器”,亏得比股票还狠

中国新闻周刊
2026-08-13 19:36:07
乌克兰无人机连续击中俄4艘军舰!开创世界战争史新纪录

乌克兰无人机连续击中俄4艘军舰!开创世界战争史新纪录

项鹏飞
2026-08-13 15:44:51
逼走胖东来的幕后人曝光!漫天要价不惯着,于东来一动作让他闭嘴

逼走胖东来的幕后人曝光!漫天要价不惯着,于东来一动作让他闭嘴

皮蛋儿电影
2026-08-11 21:43:02
胚胎案小三信息被扒:前后判若两人、疑似离异有娃,父母引以为傲

胚胎案小三信息被扒:前后判若两人、疑似离异有娃,父母引以为傲

穿透
2026-08-13 18:17:02
日方这回尴尬了!中国运动员出征日本自带食材,连水都不用当地的

日方这回尴尬了!中国运动员出征日本自带食材,连水都不用当地的

乌克兰小静
2026-08-13 02:11:10
张馨予豁出去了!全身只靠"两根带"硬撑,网友:真的很敢穿!

张馨予豁出去了!全身只靠"两根带"硬撑,网友:真的很敢穿!

黎兜兜
2026-08-13 08:11:11
独家观察:赖清德当局大阵仗查扣首辆入台“张雪”机车,背后有“四怕”!

独家观察:赖清德当局大阵仗查扣首辆入台“张雪”机车,背后有“四怕”!

海峡导报社
2026-08-13 17:34:10
2026-08-13 21:43:00
新浪财经 incentive-icons
新浪财经
新浪财经是一家创建于1999年8月的财经平台
4419276文章数 9266关注度
往期回顾 全部

科技要闻

一切皆插件!DeepSeek Harness正式发布

头条要闻

顾客221元订酒店 商家仅获40.67元:订单底价高达1573元

头条要闻

顾客221元订酒店 商家仅获40.67元:订单底价高达1573元

体育要闻

负债十几亿的联赛,还在疯狂买球星

娱乐要闻

篡改红歌已立案,郭德纲大祸临头

财经要闻

可治疗癌症?神话破灭的片仔癀 陷入争议

汽车要闻

试了奇瑞捷豹路虎神行者8,才知道它的i-ATS有多强?

态度原创

家居
亲子
时尚
游戏
军事航空

家居要闻

2026建博会(广州) 公装联探展交流活动

亲子要闻

力安真的太好玩了

换季搭配,怎么能少了牛仔外套?

《影之刃零》获央媒、地方主流媒体轮番报道

军事要闻

特朗普发文:伊朗已经完蛋

无障碍浏览 进入关怀版