Server-sent Events(SSE)是一种 Web 技术,允许服务器向客户端发送事件流,传输的内容可以是文本、 JSON 或者 XML 等格式。相对于 WebSocket, SSE 建立连接的流程比较简单,且只需要使用 HTTP 协议即可,使其更具互操作性。
如何建立 SSE 连接
一个 SSE 连接包括两个部分:客户端和服务器。对于服务器端,可以用 Node.js 或者 PHP 来实现;客户端可以使用 HTML5 的 EventSource 对象来接受事件流。以下是 SSE 建立连接的步骤:
服务器端
1.服务器端首先需要判断请求是否为 SSE 请求,可以通过判断请求头的Accept
是否为text/event-stream
来确定。
if ($_SERVER['HTTP_ACCEPT'] == 'text/event-stream') { // 处理 SSE 连接 }
2.在确定请求为 SSE 请求后,需要设置响应头,告诉客户端传输的内容是 SSE 事件流。设置的响应头如下:
header('Content-Type: text/event-stream'); header('Cache-Control: no-cache');
3.在 SSE 连接中,如果服务器端需要推送事件给客户端,需要使用event:
、data:
和 id
三个字段来描述事件,具体格式如下:
event: 名称 data: 数据 id:消息ID
事件名称可以根据开发者的需要自由定义,数据可以是字符串、JSON、XML 或者纯文本。例如下面的代码实现了向客户端推送一条事件:
echo "event: message\n"; echo "data: Hello, world!\n\n"; flush();
4.在 PHP 中如果想保持事件流的持久连接,需要防止 PHP 超时机制,可以在执行该脚本前设置不超时。
set_time_limit(0);
客户端
1.打开一个 SSE 连接:
var source = new EventSource("/api/sse");
2.监听服务端发送的消息:
source.addEventListener("message", function(event) { console.log(event.data); });
SSE 连接的特点
相对于普通的 Ajax 轮询,SSE 连接有以下几个优点:
SSE 连接是单向的,只允许服务器推送消息给客户端,从而减少了网络负载,也不会引起浏览器卡顿等问题。
SSE 连接可以保持长时间的连接,不需要频繁地建立、关闭连接,从而可以大大降低服务器压力。
SSE 连接的实现比较简单,既可以使用 Node.js 来实现,也可以使用 PHP 实现。
适用场景
相对于 WebSocket, SSE 更适合一些特定的场景,例如实时更新金融、体育、天气等信息的网站,以及在线聊天室等场景。
总结
本文介绍了 SSE 技术的基本概念,以及如何构建 SSE 连接。SSE 技术能够实现非常实用的功能,但同时也有其自身的限制,例如只能向客户端推送消息而不能接受客户端的消息等。在实际应用中,开发者需要根据具体的需求选择合适的技术,并充分考虑兼容性和性能等因素。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6461c4d9968c7c53b031de8e