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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
nodejs中exports与module.exports的区别详细介绍
Jan 14 NodeJs
nodejs读取memcache示例分享
Jan 02 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 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 include,include_once,require,require_once
2008/09/05 PHP
ajax实现无刷新分页(php)
2010/07/18 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
htm调用JS代码
2007/03/15 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
深入理解移动前端开发之viewport
2018/10/19 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
django fernet fields字段加密实践详解
2019/08/12 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
"引用"与多态的关系
2013/02/01 面试题
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
药店主任岗位责任制
2014/02/10 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
青年教师个人总结
2015/02/11 职场文书
期末个人总结范文
2015/02/13 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
无保留意见审计报告
2015/06/05 职场文书