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 npm包管理的配置方法及常用命令介绍
Jun 05 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 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
人族 TERRAN 概述
2020/03/14 星际争霸
php循环输出数据库内容的代码
2008/05/24 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
JS库之wow.js使用方法
2017/09/14 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
Python之re操作方法(详解)
2017/06/14 Python
python实现类之间的方法互相调用
2018/04/29 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
简历中求职的个人自我评价
2013/12/03 职场文书
物业工作计划书
2014/01/10 职场文书
酒店管理求职信
2014/06/09 职场文书
推普周活动总结
2014/08/28 职场文书
邀请函怎么写
2015/01/30 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技