SSE之EventSource学习

        SSE 的客户端 API 部署在EventSource对象上,EventSource是一个用于接收服务器发送的事件流的API。它允许客户端通过HTTP连接订阅服务器端的事件,并在服务器端发送事件时接收到通知。

        使用EventSource非常简单,只需要在客户端创建一个新的EventSource对象,然后指定要连接的服务器端URL即可。一旦连接建立,服务器端发送的事件将会被自动接收并触发相应的事件处理函数。

EventSource属性有:

  • readyState: 表示EventSource对象的状态,有三种可能的值:CONNECTING(连接中)、OPEN(已连接)、CLOSED(已关闭)。
    0:相当于常量EventSource.CONNECTING,表示连接还未建立,或者断线正在重连。
    1:相当于常量EventSource.OPEN,表示连接已经建立,可以接受数据。
    2:相当于常量EventSource.CLOSED,表示连接已断,且不会重连。
  • url: 表示EventSource对象连接的服务器端URL。
  • withCredentials: 表示是否携带跨域请求的凭据,可以设置为true或false。
    var source = new EventSource(url, { withCredentials: true });

EventSource 的工作原理:

  1. 客户端向服务器发起 HTTP GET 请求,请求一个特定的 URL。
  2. 服务器接收请求,并在 HTTP 头中添加 "Content-Type: text/event-stream"。
  3. 服务器建立一个持续的 HTTP 连接,向客户端发送数据,直到连接被关闭。
  4. 当服务器有新的事件数据要发送时,它将这些数据以特定的格式发送给客户端。事件数据格式如下: 
    data: eventData; //事件数据
    event:eventName; //事件名
    id:id; //数据标识符,相当于每一条数据的编号
    retry //指定浏览器重新发起连接的时间间隔
    
  5. 客户端通过 EventSource 对象注册事件处理函数,以接收来自服务器的事件数据(文本格式)。当客户端接收到来自服务器的事件数据时,它将创建一个 Event 对象,并触发相应的事件处理函数,传递 Event 对象作为参数。Event 对象包含以下属性:
    type:事件类型,通常为 "message"。 
    data:事件数据。 
    lastEventId:上一个事件的 ID。 
    origin:事件源的 URL。
  6. 当连接出现错误或被关闭时,客户端将触发 "error" 事件或 "close" 事件,以便进行错误处理或重新连接。

附录: 

        在这里想强调一下服务器的EventSource 的工作原理:中的第四点的event事件,event字段表示是自定义的事件类型,默认是message事件。浏览器可以用addEventListener()监听该事件。

服务器:

event: foor

客户端:

source.addEventListener('foor', function (event) {
  var data = event.data;
  // handle message
}, false);

参考与推荐: 更详细版本强烈推荐大家一定一定要阅读阮一峰大大的文章!!!太详细了!!!

javascript EventSource:实时服务器端推送 - 掘金 (juejin.cn)

Server-Sent Events 教程 - 阮一峰的网络日志 (ruanyifeng.com)

EventSource: EventSource() constructor - Web APIs | MDN (mozilla.org)

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSE (Server-Sent Events) 是一种用于实现服务器向客户端推送实时数据的技术,它基于HTTP协议,使用长连接来保持客户端和服务器之间的通信,并且服务器可以随时向客户端推送数据。 EventSource 是一个 JavaScript API,用于接收 SSE 服务器端推送的数据,并将其呈现给用户。使用 EventSource API,可以在客户端创建一个 SSE 连接,并监听服务器端推送的事件。当服务器端有新数据时,EventSource 会自动接收并触发相应的事件,从而实现实时输出。 以下是 SSEEventSource 的使用示例: 1. 服务器端: ```python from flask import Flask, Response app = Flask(__name__) @app.route('/stream') def stream(): def event_stream(): for i in range(10): yield 'data: %s\n\n' % i return Response(event_stream(), mimetype="text/event-stream") ``` 2. 客户端: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SSE Demo</title> </head> <body> <ul id="msg-list"> </ul> <script> var source = new EventSource("/stream"); source.onmessage = function(event) { var node = document.createElement("LI"); var textnode = document.createTextNode(event.data); node.appendChild(textnode); document.getElementById("msg-list").appendChild(node); }; </script> </body> </html> ``` 在上述示例中,服务器端使用 Flask 框架创建一个 SSE 连接,每隔一秒钟推送一个数据,客户端使用 EventSource API 创建一个 SSE 连接,并监听服务器端推送的数据,将数据添加到页面上的列表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值