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

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. SuperMap iServer新增支持FlatGeobuf数据格式,查询渲染性能提升2-3倍

    导语 FlatGeobuf是一种地理数据存储格式,采用了二进制编码,相比其他文本或XML格式更高效,可以显著减小文件大小,这使得数据的传输和存储更加快速和高效. SuperMap iServer 11 ...

  2. 剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642

    **问题描述 总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为1~8,如果蚱蜢所在的盘子紧邻着空盘子,那么该蚱蜢可以从自己的盘子跳到空盘子中,也可以隔一个盘子跳到空盘子中,问一开始 ...

  3. 《Vue.js 设计与实现》读书笔记 - 第7章、渲染器的设计

    第7章.渲染器的设计 7.1 渲染器与响应系统的结合 渲染器需要有跨平台的能力. 在浏览器端会渲染为真实的 DOM 元素. const { effect, ref } = VueReactivity ...

  4. PC软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具

    前言 国庆假期各种活动比较多,直到上班才有时间来更新文章~ 不过这两天我还是做了个小玩意(Clipify),起因是想给之前开发来自己用的简单视频剪辑工具 QuickCutSharp 加个功能,不过这个 ...

  5. KubeSphere 社区双周报 | OpenFunction v1.0.0 发布 | 2023.03.03-03.16

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  6. 2024Ciscn总决赛Web Writeup

    前言 鸽了三个月的复现计划:) ezjs 考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码 const express = require('express') ...

  7. VScode如何设置浅色侧栏

    原文地址:https://blog.csdn.net/KaiSarH/article/details/113241334 vscode主题设置成了浅色,但是侧边栏仍然是灰色,非常讨厌. 在设置中对&q ...

  8. Vmware Workstation的虚拟机如何通过宿主机的无线网卡和外部通信

    今天需要在我的笔记本w10电脑上安装一个linux虚拟机,苦于我的w10是家庭版,没有hyper-v功能,所以安装了 vmware的workstation的软件,然后创建了虚拟机,但是总是搞不定如何让 ...

  9. ubuntu环境安装街机风格的太空飞船游戏(2D飞机射击游戏)游戏——Chromium_B.S.U.

    相关: https://en.wikipedia.org/wiki/Chromium_B.S.U. https://manpages.ubuntu.com/manpages/focal/en/man6 ...

  10. 10-3 定制操作lambda

    目录 10.3.1 向算法传递函数 谓词 排序算法 10.3.2 lambda表达式 引入 介绍lambda 向lambda传递参数 使用捕获列表 调用find_if 使用for_each 完整的bi ...