Server-sent Events(SSE) 应用实例分享:实时股票行情推送

在 web 应用中,有一种常见的场景是需要向客户端推送实时信息,比如股票行情、货币汇率等。对于这种实时信息推送需求,我们可以使用 Server-sent Events(SSE) 技术来实现。

在本文中,我们将通过一个实际的案例来介绍 SSE 技术的应用。我们将编写一个实时股票行情推送的示例程序,通过该程序,用户可以实时地查看股票的最新价格、涨跌幅等信息。

Server-sent Events(SSE) 简介

SSE 是一种将服务器推送数据到客户端的技术。与 WebSockets 不同的是,SSE 不需要建立全双工通信通道,而是采用单向通信,将服务器端的事件推送到客户端。SSE 采用基于 HTTP 的长连接,客户端通过发起一个 HTTP 请求,服务器端保持连接不断开,并在有新数据时将数据通过该连接推送给客户端。

使用 SSE 技术,我们无需考虑网络传输、浏览器兼容性等问题,可以轻松地实现实时信息的推送。

实现实时股票行情推送

前端代码实现

首先,我们需要在前端页面中创建一个 EventSource 对象,用于接收服务器端推送的事件。代码如下:

var eventSource = new EventSource("http://localhost:8080/stock");

上述代码创建了一个 EventSource 对象,用于接收服务器端推送的事件,URL 参数指定了服务器端推送的地址为 http://localhost:8080/stock。

接下来,我们需要在该对象上绑定事件处理程序,将接收到的事件内容渲染到前端页面中。代码如下:

eventSource.onmessage = function(event) {
  var data = JSON.parse(event.data);
  render(data);
}

上述代码对 EventSource 对象绑定了 onmessage 事件,当服务器端推送消息时,该事件被触发,我们解析消息内容并调用渲染函数 render() 来更新页面。

后端代码实现

为了模拟股票行情数据的推送,我们编写了一个 Node.js 服务器程序,通过 Express 框架来实现 SSE 推送功能。代码如下:

const express = require('express');
const app = express();

app.use(express.static('public'));

app.get('/stock', function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });

  setInterval(function() {
    var data = generateStockData();
    res.write('data: ' + JSON.stringify(data) + '\n\n');
  }, 2000);
});

function generateStockData() {
  var price = Math.random() * 1000;
  var change = Math.random() * 10 - 5;
  var percentChange = (change / price) * 100;

  return {
    symbol: 'AAPL',
    price: price.toFixed(2),
    change: change.toFixed(2),
    percentChange: percentChange.toFixed(2) + '%'
  };
}

app.listen(8080, function() {
  console.log('Server running at http://localhost:8080');
});

上述代码中,我们创建了一个 Express 应用程序,当客户端发起 /stock 的 HTTP 请求时,返回一个数据流,用于向客户端推送实时股票行情数据。通过 setInterval 函数,我们每两秒钟向客户端推送一次数据,利用 Math.random() 来生成随机的股票行情数据。

要注意的是,返回的数据流需要指定 Content-Type 为 text/event-stream,以及 Connection 为 keep-alive,这样浏览器才会保持长连接并持续接收推送消息。

总结

本文介绍了 SSE 技术的应用实例,通过实现一个实时股票行情推送的示例程序,展示了 SSE 在实际应用中的优秀表现。本文希望能够为 Web 开发者提供一定的参考和指导,帮助大家更好地实现实时信息推送的功能。

示例代码

前端代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>实时股票行情</title>
</head>
<body>
  <ul id="list"></ul>
  <script>
    var eventSource = new EventSource("http://localhost:8080/stock");

    eventSource.onmessage = function(event) {
      var data = JSON.parse(event.data);
      render(data);
    };

    function render(data) {
      var li = document.createElement('li');
      li.innerHTML = data.symbol + ': ' + data.price + ' (' + data.change + ', ' + data.percentChange + ')';
      document.getElementById('list').appendChild(li);
    }
  </script>
</body>
</html>

后端代码:

const express = require('express');
const app = express();

app.use(express.static('public'));

app.get('/stock', function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });

  setInterval(function() {
    var data = generateStockData();
    res.write('data: ' + JSON.stringify(data) + '\n\n');
  }, 2000);
});

function generateStockData() {
  var price = Math.random() * 1000;
  var change = Math.random() * 10 - 5;
  var percentChange = (change / price) * 100;

  return {
    symbol: 'AAPL',
    price: price.toFixed(2),
    change: change.toFixed(2),
    percentChange: percentChange.toFixed(2) + '%'
  };
}

app.listen(8080, function() {
  console.log('Server running at http://localhost:8080');
});

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


纠错反馈