node + vue 实现服务端单向推送消息,利用EventSource
场景:后台系统需要实时收到电池报警消息,并语音提醒,前台不需要发送任何东西,所以想的是,服务端单向推送
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依赖,当监听到某个事件的触发,就主动推送一条消息,
改造之后的代码如下:
// 增加一个监听事件
// 当监听到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.使用SignalR实现页面即时刷新(服务端主动推送)
模块功能说明: 实现技术:sqlserver,MVC,WebAPI,ADO.NET,SignalR(服务器主动推送) 特殊车辆管理--->移动客户端采集数据存入数据库---->只要数据库数 ...
- 使用SignalR实现页面即时刷新(服务端主动推送)
模块功能说明: 实现技术:sqlserver,MVC,WebAPI,ADO.NET,SignalR(服务器主动推送) 特殊车辆管理--->移动客户端采集数据存入数据库---->只要数据库数 ...
- 使用SignalR从服务端主动推送警报日志到各种终端(桌面、移动、网页)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 使用SignalR从服务端主动推送警报日志到各种终端(桌面.移动.网页) 阅读导航 本文背景 ...
- java-给微信推送消息 利用企业微信
目的:给关注用户推送消息 场景:自动化测试,运维监控,接口访问等报错预警.例如线上接口报错,发送提醒消息 准备工作: 1:注册企业号(为什么不用公众号呢?) 企业号注册 2:常用参数介绍: 1:COR ...
- SSE技术详解:使用 HTTP 做服务端数据推送应用的技术
SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来 ...
- ASP.NET SignalR 系列(七)之服务端触发推送
前面几章讲的都是从客户端触发信息推送的,但在实际项目中,很多信息可能是由系统服务端推送的,下面2图分别展示两种通道 客户端触发推送 服务端推送 下面我们就重点介绍下服务端如何调用集线器的对象进行推送 ...
- SignalR 实现web浏览器客户端与服务端的推送功能
SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...
- Spring Boot 集成 WebSocket 实现服务端推送消息到客户端
假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...
- Android为TV端助力 不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- android不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
随机推荐
- SuperMap iServer新增支持FlatGeobuf数据格式,查询渲染性能提升2-3倍
导语 FlatGeobuf是一种地理数据存储格式,采用了二进制编码,相比其他文本或XML格式更高效,可以显著减小文件大小,这使得数据的传输和存储更加快速和高效. SuperMap iServer 11 ...
- 剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642
**问题描述 总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为1~8,如果蚱蜢所在的盘子紧邻着空盘子,那么该蚱蜢可以从自己的盘子跳到空盘子中,也可以隔一个盘子跳到空盘子中,问一开始 ...
- 《Vue.js 设计与实现》读书笔记 - 第7章、渲染器的设计
第7章.渲染器的设计 7.1 渲染器与响应系统的结合 渲染器需要有跨平台的能力. 在浏览器端会渲染为真实的 DOM 元素. const { effect, ref } = VueReactivity ...
- PC软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
前言 国庆假期各种活动比较多,直到上班才有时间来更新文章~ 不过这两天我还是做了个小玩意(Clipify),起因是想给之前开发来自己用的简单视频剪辑工具 QuickCutSharp 加个功能,不过这个 ...
- KubeSphere 社区双周报 | OpenFunction v1.0.0 发布 | 2023.03.03-03.16
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- 2024Ciscn总决赛Web Writeup
前言 鸽了三个月的复现计划:) ezjs 考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码 const express = require('express') ...
- VScode如何设置浅色侧栏
原文地址:https://blog.csdn.net/KaiSarH/article/details/113241334 vscode主题设置成了浅色,但是侧边栏仍然是灰色,非常讨厌. 在设置中对&q ...
- Vmware Workstation的虚拟机如何通过宿主机的无线网卡和外部通信
今天需要在我的笔记本w10电脑上安装一个linux虚拟机,苦于我的w10是家庭版,没有hyper-v功能,所以安装了 vmware的workstation的软件,然后创建了虚拟机,但是总是搞不定如何让 ...
- ubuntu环境安装街机风格的太空飞船游戏(2D飞机射击游戏)游戏——Chromium_B.S.U.
相关: https://en.wikipedia.org/wiki/Chromium_B.S.U. https://manpages.ubuntu.com/manpages/focal/en/man6 ...
- 10-3 定制操作lambda
目录 10.3.1 向算法传递函数 谓词 排序算法 10.3.2 lambda表达式 引入 介绍lambda 向lambda传递参数 使用捕获列表 调用find_if 使用for_each 完整的bi ...