【node-express-sse】Server Sent Event 单向推送消息,实现站内信功能

实现效果

服务端返回的 Content-Type 是 text/event-stream,这是一个流,可以多次返回内容。
Sever Sent Event 就是通过这种消息来随时推送数据。
AIGC,如 ChatGPT 打字机消息回复实现原理 等也是使用sse实现。
还有站内信,或者一些日志推送,相较于繁重的 WebSockets,SSE 无疑是 H5 简单即时数据更新的轻量级代替方案。

源码:https://github.com/thinkasany/nestjs-course-code/tree/master/sse

在这里插入图片描述

代码

前端

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>React App</title>
</head>
<body>
  <div id="root"></div>
  <script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  <script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>

  <script type="text/babel">

    function App() {
        const [messages, setMessages] = React.useState([]);
        React.useEffect(() => {
          const eventSource = new EventSource('http://localhost:3001/stream');
          eventSource.onmessage = ({ data }) => {
            const newData = JSON.parse(data).msg.split('\n').filter(str => str.trim() !== '');
            // console.log('New message', newData);
            setMessages(newData);
          };
          return () => {
            eventSource.close();
          };
        }, []);

      return (
        <div>
          <ul>
            {messages.map((message, index) => (
              <li key={index}>{message}</li>
            ))}
          </ul>
        </div>
      );
    };

    ReactDOM.render(<App />, document.getElementById('root'));
  </script>
</body>
</html>

后端

const { exec } = require("child_process");
const { Observable } = require("rxjs");

const getLogChange = async (req, res) => {
  const childProcess = exec("tail -f ./log");

  res.setHeader("Content-Type", "text/event-stream");
  res.setHeader("Cache-Control", "no-cache");
  res.setHeader("Connection", "keep-alive");

  const observer = msg => {
    res.write(`data: ${JSON.stringify({ msg: msg.toString() })}\n\n`);
  };

  const observable = new Observable(obs => {
    childProcess.stdout.on("data", msg => {
      obs.next(msg);
    });
  });

  const subscription = observable.subscribe(observer);

  // 当连接断开时,停止子进程和 Observable
  req.on("close", () => {
    childProcess.kill();
    subscription.unsubscribe();
  });
};

module.exports = {
  getLogChange
};

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node-Media-Server 是一个基于 Node.js 开发的高效流媒体服务器,它支持 RTMP、HLS、HTTP-FLV 等多种协议,可以实现流媒体的推流、转码、分发等功能。以下是使用 Node-Media-Server 实现高效推流的步骤: 1. 安装 Node-Media-Server 可以使用 npm 或 yarn 安装 Node-Media-Server,具体命令如下: ``` npm install node-media-server ``` 或 ``` yarn add node-media-server ``` 2. 创建 Node-Media-Server 实例 在 Node.js 文件中引入 Node-Media-Server 模块,并创建一个 Node-Media-Server 实例,示例如下: ```javascript const NodeMediaServer = require('node-media-server'); const config = { rtmp: { port: 1935, chunk_size: 60000, gop_cache: true, ping: 60, ping_timeout: 30 }, http: { port: 8000, allow_origin: '*' }, trans: { ffmpeg: '/usr/local/bin/ffmpeg', tasks: [ { app: 'live', hls: true, hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]', dash: true, dashFlags: '[f=dash:window_size=3:extra_window_size=5]' } ] } }; const nms = new NodeMediaServer(config); ``` 3. 监听推流事件 在创建 Node-Media-Server 实例后,可以监听推流事件,例如 `prePublish` 事件,该事件在客户端开始推流之前触发,可以在该事件中进行推流鉴权等操作。示例如下: ```javascript nms.on('prePublish', (id, StreamPath, args) => { const session = nms.getSession(id); // 进行推流鉴权等操作 }); ``` 4. 启动 Node-Media-Server 在配置好 Node-Media-Server 实例并监听推流事件后,可以调用 `nms.run()` 方法启动 Node-Media-Server,示例如下: ```javascript nms.run(); ``` 以上是使用 Node-Media-Server 实现高效推流的基本步骤,可以根据实际需求进行相应的配置和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值