使用 Server-Sent Events 实现实时火车到站提示

前言

Server-Sent Events (SSE)是一种 HTML5 提供的实时通信技术,它允许浏览器端通过一种持续的连接,接收来自服务器端的实时事件推送。

在 Web 应用程序中,SSE 技术通常被用于实现实时通知、实时数据更新等功能。

本文将详细介绍如何使用 SSE 技术实现实时火车到站提示功能。

功能介绍

为了方便说明,我们以一个简化的功能需求为例:

用户在网站上输入火车站的名称,系统需要实时获取该火车站的即将到站的火车信息,并将其实时显示在页面上。

通常,这个功能需要满足以下要求:

  • 实时性:系统需要实时获取到站信息,并实时显示在页面上。
  • 数据量:每个火车站可能会有数百、数千条到站信息,需要处理大量的数据。
  • 可靠性:服务器端需要保证数据传输的可靠性,以免数据丢失或重复发送。

下面,我们将一步步地实现这个实时火车到站提示功能。

技术方案

本文选择了以下技术方案:

  • 服务器端:Node.js + Express + MongoDB
  • 前端:HTML5 + CSS3 + JavaScript
  • 客户端通信:Server-Sent Events

服务器端实现

MongoDB 数据库

我们需要准备一个 MongoDB 数据库,用来存储火车到站信息。

具体实现过程略。

Express 路由

我们需要在 Express 中定义一个路由,用来接收客户端的请求,并返回 SSE 实时数据流。

代码示例:

上述代码中,我们定义了一个 GET /train/:station 的路由,用来接收客户端请求。

在这个路由中,我们首先获取客户端请求中指定的火车站名称 station

然后,我们设置了 Content-TypeCache-Control 等 HTTP 头部信息,并通过 res.stream() 方法返回一个 SSE 实时数据流。

接下来,我们使用 Train.find() 函数从 MongoDB 中查询到站数据并返回一个数据流,在返回的数据流上,我们注册了三个事件处理器:

  • data 事件:当有新数据时,我们将该数据转换为 SSE 协议格式,并通过实时数据流向客户端推送数据。
  • error 事件:当查询发生错误时,我们关闭实时数据流并打印日志。
  • close 事件:当查询结束时,我们关闭实时数据流并打印日志。

整个过程中,我们使用了 Node.js 的 stream 模块来处理实时数据流。

后台服务

我们需要在 Node.js 中创建一个后台服务,用来监听客户端请求,并将请求转发到 Express 路由。

代码示例:

上述代码中,我们先使用 mongoose.connect() 方法连接到 MongoDB 数据库。

然后,我们使用 app.use() 方法注册了一个 Express 路由。

最后,我们使用 app.listen() 方法启动了一个 HTTP 服务器。

前端实现

HTML5 页面

我们需要在 HTML5 页面中添加一个火车站输入框和一个实时到站信息列表。

代码示例:

上述代码中,我们在 HTML 代码中定义了一个文本框(ID 为 station)和一个数据列表(ID 为 trainTable)。

CSS3 样式

我们需要在 CSS3 中定义一些样式,美化 HTML 页面。

代码示例:

略。

JavaScript 脚本

我们需要编写 JavaScript 脚本,用来向服务器端请求实时数据,并将实时数据显示在页面上。

代码示例:

上述代码中,我们通过 document.querySelector() 方法获取到文本框 stationInput 和数据列表 trainTable

然后,我们使用 new EventSource() 方法创建了一个 SSE 连接,并向服务器端发起请求。

在 SSE 连接中,我们注册了三个事件处理器:

  • open 事件:当连接成功时,我们在浏览器控制台中打印一条日志。
  • error 事件:当连接出错时,我们在浏览器控制台中打印一条错误日志。
  • traindata 事件:当有新数据到达时,我们将该数据添加到数据列表 trainTable 中。

同时,我们通过 addEventListener() 方法注册了一个 change 事件处理器,用于处理文本框内容变化时,重新发起 SSE 连接并获取数据。

总结

本文介绍了如何使用 SSE 技术实现实时火车到站提示功能。

在本文中,我们选择了 Express + MongoDB 技术栈作为后端,选择了 HTML5 + CSS3 + JavaScript 技术栈作为前端。

在实现过程中,我们使用了 Node.js 的 stream 模块来处理实时数据流,并使用了 EventSource 对象在客户端与服务器之间建立 SSE 连接。

上述技术方案既可以满足实时性的要求,又可以处理大量的数据,同时具有较高的可靠性。

希望本文可以对读者在深入学习 SSE 技术方面提供一些指导意义。

示例代码

本文的完整示例代码已上传至 Github,欢迎有兴趣的读者进行研究。

https://github.com/littlesqx/sse-train-demo

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6548644a7d4982a6eb2aa17d


纠错
反馈