严格意义上,HTTP协议服务器无法主动发送消息,但是可以转换成发送流信息;
sse就是利用这种机制,使用流信息的方式向浏览器发送信息,基于HTTP协议;
1.区别
sse和websocket很相似,都是建立服务器与浏览器之前的通信渠道,服务器向浏览器推送消息。
websocket更强大,它支持双向推送信息;sse只能单向通信,服务器向浏览器推送流消息,本质上为下载;
2.特点
-
sse是HTTP协议,现有的服务器软件都支持,websocket是独立的协议;
-
sse轻量级,使用简单,websocket协议相对复杂;
-
sse支持断线重连,websocket需要自己处理;
-
sse一般只用来传送文本,二进制数据需要编码后传送,websocket默认支持二进制数据;
-
sse支持自定义发送的消息类型
3.客户端Api
sse的客户端API部署在EventSource对象上
检查浏览器是否支持sse(浏览器基本都支持)
javascript
if ('EventSource' in window) {
// ...
}
3.1案例一:
javascript
var source = new EventSource('http://127.0.0.1:8844/stream');
var div = document.getElementById('example');
source.onopen = function (event) {
div.innerHTML += '<p>Connection open ...</p>';
};
source.onerror = function (event) {
div.innerHTML += '<p>Connection close.</p>';
};
source.addEventListener('connecttime', function (event) {
div.innerHTML += ('<p>Start time: ' + event.data + '</p>');
}, false);
source.onmessage = function (event) {
div.innerHTML += ('<p>Ping: ' + event.data + '</p>');
};
// 关闭连接
source.close()
根据EventSource实例上的readyState属性,获取当前的连接状态,只读
-
相当于常量
EventSource.CONNECTING
,表示连接还未建立,或者断线正在重连。 -
相当于常量
EventSource.OPEN
,表示连接已经建立,可以接受数据。 -
相当于常量
EventSource.CLOSED
,表示连接已断,且不会重连。
4.服务器
javascript
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
每一次发送的信息,由若干个message
组成,每个message
之间用\n\n
分隔。每个message
内部由若干行组成,每一行都是如下格式。
javascript
[field]: value\n
前端接收的的message数据是json格式,需要JSON.parse转下
- data 内容
- event 事件类型,默认是message,可以使用addEventListener()监听该事件
- id 数据标识符
- retry 服务器可以通过该字段,指定浏览器重新发起连接的时间间隔
4.1返回案例
javascript
{
"data": "{\"msg\":helloworld哈哈哈哈哈}",
"event": "message",
"id": ""
"retry":""
}
导致浏览器重新发起请求的原因
-
时间间隔到期
-
网络错误
参考文件:
仅供参考