除了 Websocket ,服务端还有什么办法能向浏览器主动推送信息?

  • 前言
  • 端倪
  • Server-Sent Events 是什么?
  • Server-Sent Events 与 Websocket 对比
  • 总结

前言

打工的时候,偶尔在闲暇时刻偷偷打开一下股票网站,看看今天有没有赚钱,说不定哪天一夜暴富,这是我现在唯一的盼头……

今天我一如往常打开熟悉的“XX财富网”,输入熟悉的股票代码,点开我前几天刚买入的“XXX”……

看着冒着绿光并且一闪一闪的屏幕,我陷入了沉思……

我恍惚了一下,心想这实时刷新的数据,是后端通过websocket推过来的吗?

于是我F12看了一下,没有 websocket 连接啊!

难道除了 Websocket 还有别的办法能够让后端向前端主动推送消息?

我马上想到了 http2.0 的 server push ,但是想了想又觉得不太可能,因为 http2.0 的push并不是这个意思。

http2.0 的 server push 指的是:服务器还没有收到浏览器的请求,服务器就把各种资源推送给浏览器。比如,浏览器只请求了 index.html,但是服务器发现 index.html 内容里面需要用到 style.css、example.png,于是服务器在浏览器请求 index.html时顺便把 style.css、example.png 也一起发送给浏览器。这样的话,只需要一轮 HTTP 通信,浏览器就得到了全部资源,提高了性能。

所以很明显,http2.0 的 server push 只是复用其中一条http连接顺便把后续需要发送的一些静态资源提前发给了浏览器,并不适用于这种推送动态数据的场景(比如股票涨跌数据实时刷新、直播弹幕推送等)。

那服务器究竟是怎么实时推送了股票相关的数据呢?

端倪

于是我点开了 Fetch/XHR 看看到底是何方神圣,在不断推送数据。于是我发现了这几个请求的内容好像不断地在刷新……

从下图可以看到一秒钟推送好几条数据过来(现在是十一点半,我打开了美股)

查看这几个http请求,很容易就发现请求头和响应头的 Content-Type 和 Accept 跟其它普通的http请求不太一样。

很明显,这个服务端推送,跟这个 text/event-stream 关系很大。

于是我去查了一下相关资料,果不其然……服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events。

Server-Sent Events 是什么?

Server-Sent Events,服务器发送事件,简称SSE,是一种 HTML 5 事件通知,它允许网页获得来自服务器的更新。

严格来说,HTTP 协议是没有办法做到服务器主动推送信息的,但是有一种变通的方法可以做到,那就是服务器向客户端声明接下来要发送的是流信息(streaming)。

也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。

SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于 HTTP 协议,目前除了 IE/Edge,其他浏览器都支持。

Server-Sent Events 与 Websocket 对比

既然能让服务器主动向浏览器推送信息,那我们肯定会想到让websocket来跟它做做对比。

总的来说,Websocket 应该是更强大、更灵活、应用更广泛的,因为它是全双工通信,可以双向通信;但是SSE是单向通道,只能服务器向浏览器发送,因为流信息本质上就是下载。如果浏览器向服务器发送信息,就变成了另一次 HTTP 请求。

但是,SSE也有自己的优点。

  • SSE 使用 HTTP 协议,现有的服务器软件都支持。WebSocket 是一个独立协议。
  • SSE 比较轻量级,使用较简单;WebSocket 协议相对来说比较复杂。
  • SSE 默认支持断线重连,而WebSocket 需要自己实现。
  • SSE 一般只用来传送文本,二进制数据需要编码后传送,WebSocket 默认支持传送二进制数据。
  • SSE 支持自定义发送的消息类型。

所以 SSE 和 Websocket 适合不同的使用场景。

迟点有空的时候写个demo试试。

总结

  • 除了 Websocket ,服务端还能通过 SSE 向浏览器主动推送消息,其本质上就是一个基于 HTTP 的流。
  • 今天的工不白打,股市虽绿,但我因此收获了一个冷门的知识点安慰自己 。

除了 Websocket ,服务端还有什么办法能向浏览器主动推送信息?相关推荐

  1. 服务端是如何主动推送信息到客户端的?

    from:http://zhangtielei.com/posts/blog-android-push.html 说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有 ...

  2. 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)

    这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...

  3. 阿里物联网套件-服务端SDK学习实践(基础篇-12推送数据给设备并得到响应)

    推送数据给设备并得到响应 官方链接 特别注意:该接口目前只适用CCP协议接入的设备,MQTT协议不支持 而CCP(目前华东2节点不支持该功能) RevertRpcRequest和RevertRpcRe ...

  4. python接口服务两种方式(被调用、主动推送)

    项目中用python开发,要对外接口时,根据场景不同,一般有两种方式: 外部调用python接口,返回数据 接口主动向外部推送数据 1外部调用python接口,返回数据 这种方式一般可以通过http接 ...

  5. 服务端主动推送数据,除了 WebSocket 你还能想到啥?

    在上篇文章中,松哥和大家分享了 WebFlux 的基本用法,小伙伴们已经了解到使用 WebFlux 我们的返回值可以是 Mono 也可以是 Flux,如果是 Flux,由于 Flux 中包含多个元素, ...

  6. Qt WebSocket服务端的简单Demo

    WebSocket服务端:QWebSocketServer 目录 WebSocket服务端:QWebSocketServer **背景**: **QWebSocketServer 简单使用介绍:** ...

  7. python 3.5.2页面_Python 3.5.2实现websocket服务端

    最近由于一个项目需要,写了一个简易的websocket服务端程序,其间也参考了网上的很多资料,我将用接下来的几个篇幅说明是怎么实现的,及遇到的一系列埂. 参考 (包括且不限于如下地址) 涉及到的模块 ...

  8. python websocket server模块_Python 3.5.2实现websocket服务端(四): WebSocketServer类实现...

    #删除连接,从集合中删除连接对象item def deleteconnection(item): global connectionlist del connectionlist['connectio ...

  9. flux服务器推消息,服务端主动推送数据,除了 WebSocket 你还能想到啥?

    原标题:服务端主动推送数据,除了 WebSocket 你还能想到啥? 来自公众号: 江南一点雨 在 上篇文章 中,松哥和大家分享了 WebFlux 的基本用法,小伙伴们已经了解到使用 WebFlux ...

最新文章

  1. poj1654 Area
  2. Dubbo整合hystrix
  3. kafka的反序列化类KafkaDeserializationSchema的使用(还没整理完)
  4. jsp中获取当前项目名称
  5. python3 join函数_Python3 join函数和os.path.join用法详解
  6. anaconda 怎么安装xlrd_Pyinstaller打包,文件太大了怎么办?
  7. 【转】设计模式学习笔记之命令模式
  8. Java 14 来了!
  9. NYOJ题目1170-最大的数
  10. GroupByKey VS ReduceByKey
  11. 数字孪生开启传统行业数字化转型升级之路
  12. php开源 饭馆记账软件_个人记账软件 - 开源免费
  13. android xml画圆,Android自定义View画圆功能
  14. 牛客网练习2-《网络基础》
  15. vue-i18n 用法
  16. windows 7 系统显示电池电量95% 可用(电源已接通,未充电)解决办法
  17. Firebug网络面板里的两条竖线表示什么?
  18. 360云服务器关闭后,360云盘宣布关闭!7个问题回答告诉你关闭之后怎么办?
  19. 学生可以用计算机干什么,好学生用电脑干什么
  20. Java写的第一个小游戏(续)

热门文章

  1. golang中的图像image处理详解
  2. 百度2018营收破千亿,AI成发展主要驱动力
  3. 抖音小视频背景歌名识别的学习
  4. Java图片压缩大小,图片缩放
  5. java对图片进行压缩处理
  6. 在Unity中实现画图/字帖功能
  7. java杂谈(瞎吉尔找的练习)
  8. 深入理解Java虚拟机-高效并发
  9. Service注入不进去
  10. 8、Oracle:group by用法