JS中SSE(Server-Sentevent)服务器向浏览器推送信息

JS中SSE(Server-Sentevent)服务器浏览器推送信息SSE
服务器向浏览器推送信息,除了 WebSocket,还有⼀种⽅法:Server-Sent Events(以下简称 SSE)。本⽂介绍它的⽤法。
SSE 的本质
严格地说,HTTP 协议⽆法做到服务器主动推送信息。但是,有⼀种变通⽅法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。
也就是说,发送的不是⼀次性的数据包,⽽是⼀个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会⼀直等着服务器发过来的新的数据流,视频播放就是这样的例⼦。本质上,这种通信就是以流信息的⽅式,完成⼀次⽤时很长的下载。
SSE 就是利⽤这种机制,使⽤流信息向浏览器推送信息。它基于 HTTP 协议,⽬前除了 IE/Edge,其他浏览器都⽀持。
SSE 的特点
SSE 与 WebSocket 作⽤相似,都是建⽴浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。
总体来说,WebSocket 更强⼤和灵活。因为它是全双⼯通道,可以双向通信;SSE 是单向通道,只能服务器向浏览器发送,因为流信息本质上就是下载。如果浏览器向服务器发送信息,就变成了另⼀次 HTTP 请求。
数码彩扩但是,SSE 也有⾃⼰的优点。
SSE 使⽤ HTTP 协议,现有的服务器软件都⽀持。WebSocket 是⼀个独⽴协议。
SSE 属于轻量级,使⽤简单;WebSocket 协议相对复杂。
SSE 默认⽀持断线重连,WebSocket 需要⾃⼰实现。星空轮
SSE ⼀般只⽤来传送⽂本,⼆进制数据需要编码后传送,WebSocket 默认⽀持传送⼆进制数据。
SSE ⽀持⾃定义发送的消息类型。
因此,两者各有特点,适合不同的场合。
三、客户端 API
3.1 EventSo ur c e 对象
SSE 的客户端 API 部署在EventSource对象上。下⾯的代码可以检测浏览器是否⽀持 SSE。
if ('EventSource' in window) {
// ...
}
使⽤ SSE 时,浏览器⾸先⽣成⼀个EventSource实例,向服务器发起连接。
var source = new EventSource(url);
上⾯的url可以与当前⽹址同域,也可以跨域。跨域时,可以指定第⼆个参数,打开withCredentials属性,表⽰是否⼀起发送 Cookie。
var source = new EventSource(url, { withCredentials: true });
EventSource实例的readyState属性,表明连接的当前状态。该属性只读,可以取以下值。
0:相当于常量EventSource.CONNECTING,表⽰连接还未建⽴,或者断线正在重连。
1:相当于常量EventSource.OPEN,表⽰连接已经建⽴,可以接受数据。
2:相当于常量EventSource.CLOSED,表⽰连接已断,且不会重连。
3.2 基本⽤法
连接⼀旦建⽴,就会触发open事件,可以在onopen属性定义回调函数。
// ...
};
// 另⼀种写法
source.addEventListener('open', function (event) {
// ...绝缘子串
}, false);
客户端收到服务器发来的数据,就会触发message事件,可以在onmessage属性的回调函数。
var data = event.data;
// handle message
};
滚花铜螺母
// 另⼀种写法
source.addEventListener('message', function (event) {
var data = event.data;
// handle message
}, false);
上⾯代码中,事件对象的data属性就是服务器端传回的数据(⽂本格式)。
如果发⽣通信错误(⽐如连接中断),就会触发error事件,可以在onerror属性定义回调函数。
// handle error event
};
屋顶融雪装置// 另⼀种写法
source.addEventListener('error', function (event) {
// handle error event
}, false);
close⽅法⽤于关闭 SSE 连接。
source.close();
3.3 ⾃定义事件
默认情况下,服务器发来的数据,总是触发浏览器EventSource实例的message事件。开发者还可以⾃定义 SSE 事件,这种情况下,发送回来的数据不会触发message事件。
source.addEventListener('foo', function (event) {
var data = event.data;
卡片式u盘// handle message
}, false);
上⾯代码中,浏览器对 SSE 的foo事件进⾏监听。如何实现服务器发送foo事件,请看下⽂。

本文发布于:2024-09-20 22:46:36,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/265893.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:服务器   数据   浏览器   属性
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议