HTML5数据推送SSE原理及应用开发

2023-09-18 09:08:56

JavaScript表达行为,CSS表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数据推送技术的产生。

SSE是一种允许服务器端向客户端推送新数据(简称数据推送)的HTML5技术。数据推送有两种替代方案:无更新方案和数据拉取方案。

无更新方案:

加载完毕HTML之后,得到一个HTML页面,之后浏览器会请求图片、CSS文件和JavaScript文件等,他们都是浏览器可以缓存的静态文件。如果页面使用后端语言,比如PHP、Ruby和Python等为用户动态生成HTML的语言。

数据拉取方案:

浏览器会基于一些用户行为,或在一定时间之后,或基于某种别的触发方案,向服务器端请求或全部更新数据,通过javascript或一个meta标签能够命令整个页面重新加载。我们所熟悉的Ajax技术只被用于请求最新数据,当收到数据时,javascript函数会利用它来局部更新DOM。数据拉取的要义:仅拉取新数据,并且只更新页面中受影响部

以上的都不是数据推送,数据推送不是静态文件,也不涉及浏览器为更新数据而发起请求,数据推送是由服务器选择客户端发送新数据。

当数据源有新数据时,服务器端能立刻发送给一个或多个客户端,而不用等客户端来请求,这些新数据可能是突发新闻、最新股票、上线朋友的聊天信息、新的天气预报、策略游戏中的下一步等。

SSE适用于更新频繁、低延迟并且数据都是从服务端到客户端。它和WebSocket的区别:

1)便利,不需要添加任何新组件,用任何习惯的后端语言和框架就能继续使用,不用为新建虚拟机弄一个新的IP或新的端口号而劳神。

2)服务器端的简洁。因为SSE能在现有的HTTP/HTTPS协议上运作,所以它能够直接运行于现有的代理服务器和认证技术。

WebSocket相较SSE最大的优势在于它是双向交流的,这意味着服务器发送数据就像从服务器接受数据一样简单,而SSE一般通过一个独立的Ajax请求从客户端向服务端传送数据,因此相对于WebSocket使用Ajax会增加开销。因此,如果需要以每秒一次或者更快的频率向服务端传输数据,就应该用WebSocket。

具体代码如下:

html代码

<!doctype html><html>
    <head>
        <meta charset="UTF-8">
        <title>basic SSE test</title>
    </head>
    <body>
        <pre id = "x">initializting...</pre>
        <!--之所以使用pre标签而不是p或者div是为了确保数据能以它被接受时的格式呈现,而不会修改或格式化-->

    </body>
    <script>
        var es = new EventSource("basic_sse.php");
        es.addEventListener("message",function(e){            //e.data
            document.getElementById("x").innerHTML += "\n"+e.data;
        },false);//使用false表示在冒泡阶段处理事件,而不是捕获阶段。
    </script></html>

需要注意的是:使用服务器端数据之前最好做一下检查,以防潜在的javascript注入攻击。

php代码

<?php
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    $time = date('r');    echo "data: The server time is: {$time}\n\n";
    flush();?>

“Content-Type: text/event-stream”是专门为SSE设计的MIME类型,

效果截图

什么时候数据推送是错误的选择

首先考虑静态的情况,不引入数据推送,每当用户打开一个页面,在浏览器和服务器之间就会打开i一个套接字连接,服务器手机信息然后返回给用户,可能很简单,就像从磁盘上加载一个静态的HTML文件或一张图片一样,也可能很复杂,就像要运行一段用以连接很多数据库的后台语言。这里的关键点就是,一旦返回了所需的信息,套接字就会关闭,每个HTTP请求都会打开一个这种生命周期相对较短的套接字连接,这些套接字是服务器上有限的资源,每当它们完成既定任务,就会被回收以循环再利用。

现在对比看一下数据推送。一个请求永远不会完成,总是有很多信息要发送,所以套接字会一直保持打开状态显然,因为它们是有限的资源,所以同一时刻的SSE连接数会有限制。

想象一种情况,你在为你最新的应用提供电话服务支持,有10个接线中心员工为1000个用户提供服务,用户遇到问题,其中一个接线员接线,然后挂线。新的客户呼叫在排队,知道其中一个接线员挂线,这是典型的网络服务模式。

但是,现在有个客户打过来说,我现在没有问题,但是接下来几个小时都会用到你们的产品,并且如果遇到问题,我希望你们立即回复。这个客户将与接线员保持通话几个小时,那么呼叫中心的10%服务资源就被浪费。如果有10个这样的客户,那么其他990个客户就无法呼叫。这就是数据推送模式。

当然,这并不总是坏事,如果这个客户一下午每隔几秒钟就有一个问题,这种情况保持电话通畅不但没有浪费10%服务资源,反而会增加。因为每个问题都需要新打一个电话(就像数据拉取),接线员需要花额外的时间,验证客户身份,调出账户,降低服务效率。保持电话通常不仅使得客户更满意,也会提高呼叫中心的工作效率,这就是数据推送的最适合场景。

更多推荐

day19正则表达式

今日内容正则表达式教学目标能够理解正则表达式的作用能够使用正则表达式的字符类能够使用正则表达式的逻辑运算符能够使用正则表达式的预定义字符类能够使用正则表达式的限定符能够使用正则表达式的分组能够在String的split方法中使用正则表达式正则表达式1.1正则表达式的概念及演示在Java中,我们经常需要验证一些字符串,例

【Flutter】2023 Google 开发者大会给 Fluter 带来了什么

文章目录一、2023年谷歌开发者大会概览二、Flutter年度进展三、Dart年度进展四、Material3年度进展五、推荐使用Flutter跨平台开发六、参考资料一、2023年谷歌开发者大会概览你知道吗,今年的谷歌开发者大会真是令人期待。从5月10日的线上GoogleI/O大会开始,到9月6日至7日在上海世博中心的现

2023年华为杯研究生数学建模竞赛辅导

2023年华为杯研究生数学建模竞赛辅导各研究生培养单位:中国研究生数学建模竞赛作为教育部学位管理与研究生教育司指导,中国学位与研究生教育学会、中国科协青少年科技中心主办的“中国研究生创新实践系列大赛”主题赛事之一,是一项面向在校研究生进行数学建模应用研究与实践的学术竞赛活动,是广大在校研究生提高建立数学模型和运用互联网

Linux多线程【线程控制】

✨个人主页:北海🎉所属专栏:Linux学习之旅🎃操作环境:CentOS7.6阿里云远程服务器文章目录🌇前言🏙️正文1、线程知识补充1.2、线程私有资源1.3、线程共享资源1.4、原生线程库2、线程控制接口2.1、线程创建2.1.1、一批线程2.2、线程等待2.3、线程终止2.4、线程实战2.5、其他接口2.5.

Flutter动态化开发之Fair实战

一、背景目前移动端应用的版本更新,最常见的方式是定期发版,无论是安卓还是iOS,都需要提交新的安装包到应用市场进行审核。审核通过后,用户在应用市场进行App的下载更新。而动态化,就是不依赖更新程序安装包,就能动态实时更新页面的技术。相比动态化技术,定期发版更新应用的方式存在一些问题,比如:审核周期长,且可能审核不通过。

【完全二叉树魔法:顺序结构实现堆的奇象】

本章重点二叉树的顺序结构堆的概念及结构堆的实现堆的调整算法堆的创建堆排序TOP-K问题1.二叉树的顺序结构普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是

PostgreSQL缓存管理

缓冲区管理器、存储和后端进程之间的关系缓存管理结构PostgreSQL缓冲区管理器由buffertable、bufferdescriptors和bufferpool组成。bufferpool层存储表和索引等数据文件页,以及空闲空间映射和可见性映射。bufferpool是一个数组,每个槽存储数据文件的一个页面。缓冲池数组

No suitable driver found for jdbc:mysql://localhost:3306/BookManagement

目录问题背景解决办法问题背景今天遇见一个这个报错,解决后将解决方案分享一下:报错内容如下:“"C:\ProgramFiles\Java\jdk1.8.0_221\bin\java.exe""-javaagent:D:\IDEA2020_1\IntelliJIDEA2020.1\lib\idea_rt.jar=51910

React 全栈体系(六)

第三章:React应用(基于React脚手架)二、组件的组合使用-TodoList3.添加todo3.1App/*src/App.jsx*///创建“外壳”组件AppimportReact,{Component}from'react'importHeaderfrom'./components/Header'import

服务器数据恢复-ESX SERVER常见故障的数据恢复的可能性分析

ESXSERVER常见故障表现:1、因光纤存储设备连接至非ESX环境,共享未互斥,对存储进行的改写操作(如:重装系统,WINDOWS初始化,格式化等)导致存储结构损坏。2、卷升级、变更时分区表或VMFS卷结构异常。3、VMFS存储中VMDK被删除。4、VMFS被格式化。ESXSERVER故障解决方案:1、检测是否存在硬

[X3m]Ubuntu 根文件系统制作

使用ubuntu20.04sudoapt-getinstallwgetca-certificatesdevice-tree-compilerpvbclzopzipbinfmt-support\build-essentialccachedebootstrapntpdategawkgcc-arm-linux-gnueabi

热文推荐