场景:后台系统需要实时收到电池报警消息,并语音提醒,前台不需要发送任何东西,所以想的是,服务端单向推送

1. 实现EventSource参考博客:

https://www.jqhtml.com/41272.html

https://developer.mozilla.org/zh-CN/docs/Web/API/Server-sent_events/Using_server-sent_events

2. 利用events监听触发事件,主动推送消息

前端代码

<script type="text/javascript">
if(typeof(EventSource)!=="undefined"){
let source=new EventSource("http://192.168.254.244:3001/api/messageNotic");
source.addEventListener('test',function(e){
console.log(e)
});
source.onmessage=function(event)
{
console.log(event)
document.getElementById("result").innerHTML+=event.data + "<br>";
};
}else{
document.getElementById("result").innerHTML="抱歉,你的浏览器不支持 server-sent 事件...";
}
</script>

后端代码

// 可读流
const Readable = require('stream').Readable; function RR() {
Readable.call(this, arguments);
}
RR.prototype = new Readable();
RR.prototype._read = function (data) { } const sse = (stream, event, data) => {
return stream.push(`event:${event}\ndata: ${JSON.stringify(data)}\n\n`)
} exports.messageNotic = async (ctx, next) => { let stream = new RR()
ctx.set({
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
Connection: 'keep-alive'
});
// sse(stream, 'test', { remindFlag: new Date() });
ctx.body = stream; // 每过30秒,发送一条注释语,保持和web端的连接。
interval = setInterval(function () {
sse(stream, 'test', { remindFlag: new Date() });
}, 1000 * 30); // 监听当web端关闭eventSource, 清除定时器
ctx.req.connection.addListener("close", function () {
clearInterval(interval);
}, false); }

到了这步,其实可以完成推送了,

但是如果想在产生报警日志的时候,发送提醒消息,就需要继续操作,

借用events依赖,当监听到某个事件的触发,就主动推送一条消息,

改造之后的代码如下:


  // events事件
  const events = require('events');
  const eventEmitter = new events.EventEmitter();

// 增加一个监听事件
// 当监听到abnormalHandler 异常函数触发,往前端推送带有报警得消息
async function abnormalHandler() {
eventEmitter.emit("abnormalHandler");
} function RR() {
Readable.call(this, arguments);
}
RR.prototype = new Readable();
RR.prototype._read = function (data) { } const sse = (stream, event, data) => {
return stream.push(`event:${event}\ndata: ${JSON.stringify(data)}\n\n`)
} exports.messageNotic = async (ctx, next) => {
  当监听到abnormalHandler事件触发,就主动推送一条消息
eventEmitter.on("abnormalHandler", function () {
console.log("data_receive ---> connection");
sse(stream, 'test', { remindFlag: 1 });
}); var stream = new RR()
ctx.set({
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
Connection: 'keep-alive'
});
// sse(stream, 'test', { remindFlag: new Date() });
ctx.body = stream; // 每过30秒,发送一条注释语,保持和web端的连接。
interval = setInterval(function () {
sse(stream, 'test', { remindFlag: new Date() });
}, 1000 * 30); // 监听当web端关闭eventSource, 清除定时器
ctx.req.connection.addListener("close", function () {
clearInterval(interval);
}, false); }

node + vue 实现服务端单向推送消息,利用EventSource的更多相关文章

  1. 1.使用SignalR实现页面即时刷新(服务端主动推送)

    模块功能说明: 实现技术:sqlserver,MVC,WebAPI,ADO.NET,SignalR(服务器主动推送) 特殊车辆管理--->移动客户端采集数据存入数据库---->只要数据库数 ...

  2. 使用SignalR实现页面即时刷新(服务端主动推送)

    模块功能说明: 实现技术:sqlserver,MVC,WebAPI,ADO.NET,SignalR(服务器主动推送) 特殊车辆管理--->移动客户端采集数据存入数据库---->只要数据库数 ...

  3. 使用SignalR从服务端主动推送警报日志到各种终端(桌面、移动、网页)

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 使用SignalR从服务端主动推送警报日志到各种终端(桌面.移动.网页) 阅读导航 本文背景 ...

  4. java-给微信推送消息 利用企业微信

    目的:给关注用户推送消息 场景:自动化测试,运维监控,接口访问等报错预警.例如线上接口报错,发送提醒消息 准备工作: 1:注册企业号(为什么不用公众号呢?) 企业号注册 2:常用参数介绍: 1:COR ...

  5. SSE技术详解:使用 HTTP 做服务端数据推送应用的技术

    SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来 ...

  6. ASP.NET SignalR 系列(七)之服务端触发推送

    前面几章讲的都是从客户端触发信息推送的,但在实际项目中,很多信息可能是由系统服务端推送的,下面2图分别展示两种通道 客户端触发推送 服务端推送 下面我们就重点介绍下服务端如何调用集线器的对象进行推送 ...

  7. SignalR 实现web浏览器客户端与服务端的推送功能

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...

  8. Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

    假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...

  9. Android为TV端助力 不需要Socket的跨进程推送消息AIDL!

    上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...

  10. android不需要Socket的跨进程推送消息AIDL!

    上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...

随机推荐

  1. ModbusRTU通信协议报文剖析

    前言 大家好!我是付工.前面给大家介绍了Modbus协议的应用层面.终于有人把Modbus说明白了那么,今天跟大家聊聊关于Modbus协议报文的那些事. 一.真实案例 前段时间有个粉丝朋友,让我帮他解 ...

  2. Springboot 项目配置 HTTPS

    生成证书 输入命令 keytool -genkeypair -alias "boot" -keyalg "RSA" -keystore "boot.k ...

  3. LeetCode 1316. Distinct Echo Substrings (RK哈希)

    题意: 给一个字符串 寻找字符串为(a+a)格式的子串有多少.a+a 格式字符串比如 abcabc, ee 等. 首先O(N^2)枚举子串,然后通过哈希在O(1)复杂度判断子串是否符合要求. RK哈希 ...

  4. js的宏任务和微任务有哪些,是怎么执行的 ?

    事件循环有宏任务和微任务: 宏任务所处的队列就是宏任务队列,队列可以有多个,第一个队列只有一个任务就是执行主线程的js代码,剩余队列任务有setTimeout setInterval  :微任务所处的 ...

  5. HRM平台的登录页的背景图片- scss

    .login-container {   // 设置背景图片   background-image: url("~@/assets/common/login.jpg");   ba ...

  6. python中队列deque的使用

    队列,堆栈是程序开发中常用的两种数据存储模型.python中队列怎么运用呢?以下内容介绍了队列的使用和队列的函数. from collections import deque q = deque() ...

  7. 小A的组合数

    小A的组合数 题目描述 \(C_n^m\)表示组合,组合公式为:\(C_n^m=\frac{n!}{m!\times (n-m)!}\),请你求出\(C_n^m\)的因子个数\(tot\),由于大难会 ...

  8. [python]多线程快速入门

    前言 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.由于CPython的GIL限制,多线程实际为单线程,大多只用来处理IO密集型任务. Python一般用标准库 ...

  9. python 爬虫如何爬取动态生成的网页内容

    ---  好的方法很多,我们先掌握一种  --- [背景] 对于网页信息的采集,静态页面我们通常都可以通过python的request.get()库就能获取到整个页面的信息. 但是对于动态生成的网页信 ...

  10. ubuntu系统下安装 steam 游戏平台

    方法1:安装命令: sudo snap install steam 方法2:下载安装: 地址: https://store.steampowered.com/about/