nodejs检测因特网是否断开的解决方案


Posted in NodeJs onApril 17, 2019

背景

最近在用Electron开发一款应用,其中有涉及到检测因特网是否断开的需求。Electron基于Chromium和Node.js,让你可以使用HTML、CSS和JavaScript构建应用。所以Electron提供nodejs、浏览器两套运行环境。

笔者最先考虑到的方案HTML5提供的online/offline网络连接事件。

window.addEventListener('online', ...)
window.addEventListener('offline', ...)

结论很失望,这两个网络连接事件,只是检测本地网络连接状态。

既然浏览器没有提供检测因特网是否断开的接口,笔者只能在nodejs寻求答案。

调研

说到nodejs,笔者最先想到是去npm仓库搜索现有的库。找到了两款检测因特网状态的库internet-available、is-online

internet-available

这个库检测因特网连接状态原理,是检测dns连接状态。

这里大家肯定有个疑问,使用nodejs原生模块dns不是更简洁吗?

你说的没错,nodejs确实提供这样的方法,但是dns原生模块并没有提供超时检测。internet-available可以设置超时参数,默认是5000ms(依赖dns-socket库实现dns超时,有兴趣可以研究其源码,这里不做展开)。

internet-available使用举例:

var internetAvailable = require("internet-available");

internetAvailable().then(function(){
 console.log("Internet available");
}).catch(function(){
 console.log("No internet");
});

如果想加入检测次数和每次检测超时时间,代码如下:

var internetAvailable = require("internet-available");

internetAvailable({
 timeout: 4000,
 retries: 10,
}).then(function(){
 console.log("Internet available");
}).catch(function(){
 console.log("No internet");
});

internet-available默认检测的DNS域名是google.com,如果想自定义域名,代码如下:

var internetAvailable = require("internet-available");

internetAvailable({
 domainName: "xxxxx.com",
 port: 53,
 host: '8.8.8.8' // 默认,国内请改成114.114.114.114
}).then(() => {
 console.log("Internet available");
}).catch(() => {
 console.log("No internet");
});

备注:8.8.8.8是谷歌公司提供的免费DNS服务器,该地址是全球通用,相对来说,更适合国外以及访问国外网站的用户使用,国内更适合用114.114.114.114。

is-online

is-online与internet-available检测方式相同,唯一区别是is-online可以在nodejs和浏览器环境同时运行。在浏览器环境下,通过navigator.onLine返回网络连接状态,但与HTML5 online、offline事件一样,只能检测本地连接。

is-online使用举例

const isOnline = require('is-online');
 
isOnline().then(online => {
 if(online){
 console.log("We have internet");
 }else{
 console.log("Houston we have a problem");
 }
});

此库也提供超时设置,且可以设置Internet协议版本,这是一个通常不需要设置的高级选项,但它对于专门断言IPv6连接非常有用,代码如下:

var isOnline = require('is-online');
 
isOnline({
 timeout: 5000,
 version: "v4" // v4 or v6
}).then(online => {
 if(online){
 console.log("Internet available");
 }else{
 console.log("No internet");
 }
});

总结

除了以上两个库,还有其他方式可以检测因特网断开吗?笔者目前想到的还可以通过发起http head请求是否成功响应判断;通过ping 目标host或者domain是否连通检测判断。如果有更好的方式,欢迎讨论~

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
NodeJS 模块开发及发布详解分享
Mar 07 NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 NodeJs
nodejs中使用monk访问mongodb
Jul 06 NodeJs
14款NodeJS Web框架推荐
Jul 11 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 NodeJs
Nodejs实现用户注册功能
Apr 14 #NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 #NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 #NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 #NodeJs
Nodejs核心模块之net和http的使用详解
Apr 02 #NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 #NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 #NodeJs
You might like
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
PHP 实现缩略图
2021/03/09 PHP
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
项目资料员岗位职责
2013/12/10 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
专业技术职务聘任书
2014/03/29 职场文书
小学班主任寄语大全
2014/04/04 职场文书
师范生求职自荐信
2014/06/14 职场文书
学前教育专业求职信
2014/09/02 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python