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 相关文章推荐
nodejs教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
Nodejs进程管理模块forever详解
Jun 01 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JS中的多态实例详解
2017/10/15 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
大学生个人简历中的自我评价
2013/12/27 职场文书
职业规划书如何设计?
2014/01/09 职场文书
洗车工岗位职责
2014/03/15 职场文书
解除合同协议书
2014/04/17 职场文书
体育比赛口号
2014/06/09 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
感谢信格式范文
2015/01/22 职场文书
聘任书格式及范文
2015/09/21 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
python ConfigParser库的使用及遇到的坑
2022/02/12 Python