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

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. 将Sublime Text添加到鼠标右键

     事件起因: 在众多 文本文档软件中,个人用过比较多,notepad++ / Edit / EditPlus / notepad--  / Sublime Text 等等,但是比较偏爱的还是 Subl ...

  2. 11-02 NOIP练习赛

    11-02 NOIP练习赛 为什么休息的天还要打练习赛,这不公平!!!!!!!!!! oh no! 但是三道题确实挺简单,也少见的很有意思. [USACO23OPEN] Milk Sum S 题面翻译 ...

  3. PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(四)

    无论100个表还是30个表,在使用PasteForm模式的时候,管理端的页面是一样的,大概4个页面, 利用不同操作模式下的不同dto数据模型,通过后端修改对应的dto可以做到控制前端的UI,在没有特别 ...

  4. 2024年8月中国数据库排行榜:OceanBase攀升再夺冠,达梦跃入三甲关

    在这个炽热的季节,随着巴黎奥运会的盛大开幕,全球将目光聚集在了体育的无限魅力和竞技的巅峰对决上.如同奥运赛场上的激烈角逐,中国数据库界也上演着一场技术与创新的较量,各个数据库产品正在中国乃至全球舞台上 ...

  5. iOS关于NSNotificationCenter通知使用小结

    常用的页面之间传值方式是参数,单例,通知,委托,以及其他全局变量等等.通知是一种广播形式,可以一对多通知传值.最近在项目中用的模块化开发, 通过封装抽取,将页面分为上中下三个模块.最简单的方式是把所有 ...

  6. 云原生周刊:Docker 推出 Docker Debug | 2023.10.9

    开源项目推荐 SchemaHero SchemaHero 是一个 Kubernetes Operator,用于各种数据库的声明式架构管理.SchemaHero 有以下目标: 数据库表模式可以表示为可以 ...

  7. AI五子棋_07 落子点四周棋形获取

    AI五子棋 第七步 恭喜你到达第七步! 到这一步,你对战场环境就有了充分的了解.下面我们准备打造机器大脑了.你可能已经有你自己的想法了,不过别着急,先跟着我的思路做.我会提示你解决一些基本的问题. 棋 ...

  8. 修改Linux服务的文件打开句柄数

    在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 在centos 5/6 等 ...

  9. att&ck学习笔记2

    一.环境搭建 靶场下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/3/ DC IP:10.10.10.10OS:Windows 2012应用:A ...

  10. IDEA 2024.2.2 最新安装教程(附激活-2099年~)

    访问 IDEA 官网 下载 IDEA 2024.2.2 版本的安装包. 下载补丁https://pan.quark.cn/s/fcc23ab8cadf 检查 进入 IDEA 中后,点击菜单 Help ...