Server-Sent Events(SSE),是HTML5的一项API,它允许我们使用标准的HTTP连接,在服务器和客户端之间实现类似WebSocket的实时双向通讯。不同的是,SSE是一种单向的通讯方式,主要用于服务器向客户端推送数据。
SSE的好处是可以避免客户端不必要的轮询请求,提高数据传输的效率和响应速度。同时,SSE的实现也比较简单,只需要前端程序员精通JavaScript,后端程序员精通Node.js即可。
SSE实现的基本原理
SSE 的基本原理是客户端通过EventSource对象创建一个HTTP请求,服务器返回一个可以一直保持打开的HTTP连接,在服务器端可以实时推送消息,即向客户端发送一个event,消息以data字段的形式传递。
HTTP/1.1 200 OK Content-Type: text/event-stream Cache-Control: no-cache event: message data: Hello world
客户端通过监听message事件来接收来自服务器的消息。当有新的消息到来时,服务器就会将消息推送到客户端,这种单向通讯方式与WebSocket相似,但WebSocket是基于全双工通讯的,通讯效率更高。
这里需要特别注意的是,SSE使用的是HTTP协议,通过长连接实现双向通讯,而非传统的websocket。
在Node.js中使用SSE
在Node.js中,我们可以使用npm安装sse中间件来实现SSE的功能。具体步骤如下:
步骤 1:安装sse
使用npm安装sse中间件:
npm install sse --save
步骤 2:实现SSE服务端
在Node.js中,实现SSE服务端也很简单,只需要引入sse中间件并创建一个HTTP服务器即可:
-- -------------------- ---- ------- ----- --- - --------------- ----- ---- - ---------------- ----- ------ - ----------------------- ---- -- - ------------------ - --------------- -------------------- ---------------- ----------- ------------- ------------ --- ----- --- - --- -------- ----- -- ---- --------------- -------- --- ------------------- -- -- - ---------------- ------ -- ------- -- ---- ------- ---
在上面的代码中,我们通过http.createServer()
创建了一个HTTP服务器,并在res.writeHead()
中设置了SSE协议需要的响应头。接下来,我们通过sse.send()
方法向客户端发送了一条消息。
步骤 3:实现SSE客户端
客户端的代码也非常简单,我们可以通过以下代码实现:
-- -------------------- ---- ------- ----- ------ - --- -------------------- ---------------------------------- ----- -- - --------------------- -------- ---------------- --- ------------------------------- ----- -- - ----------------------- ---------- --- -------------------------------- ----- -- - ------------------- ----------- ---
我们使用new EvenSource()
创建了一个SSE请求,通过addEventListener()
方法监听了用于接收消息的message
事件。其他事件包括open
事件和error
事件。
注意:在使用sse时,当有多个客户端连接到服务器时,服务器会为每个连接创建新的线程,逐渐增加服务器负担。因此对于大批量的实时数据传输,Websockets 是一个更好的选择。
给SSE协议添加自定义事件
除了默认的message
事件外,我们还可以通过自定义事件来发送特定的消息。例如,你可以在服务端创建一个用于发送时间的事件:
sse.send(new Date().toTimeString(), 'time');
然后在客户端通过添加事件监听器来接收事件和消息:
source.addEventListener('time', event => { console.log(`Received time: ${event.data}`); });
支持跨域访问
如果你需要使用SSE提供跨域服务,只需在服务端设置如下响应头:
res.writeHead(200, { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' });
总结
本文简要介绍了Node.js中使用SSE实现服务器向客户端推送消息的基本原理。通过访问服务端暴露的链接,客户端可以通过API发送请求并获取实时数据,实现了即时通讯的功能。另外在实现的过程中,还介绍了两个比较重要的事件:message和time。相信读者已经能够很好地理解SSE在实时通讯中的作用了。
完整代码请参考: https://github.com/shadowcz007/node-sse-example
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f2b171f6b2d6eab3c4efef