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 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 NodeJs
详解nodejs内置模块
May 06 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的QRcode类与大家分享
2011/11/13 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
Python中的tuple元组详细介绍
2015/02/02 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
Python 实现一个计时器
2020/07/28 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
python list的index()和find()的实现
2020/11/16 Python
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
自我评价的正确写法
2013/09/19 职场文书
勾股定理课后反思
2014/04/26 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
2015新年寄语大全
2014/12/08 职场文书
公务员年终个人总结
2015/02/12 职场文书
银行先进个人总结
2015/02/15 职场文书
校运会新闻稿
2015/07/17 职场文书
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技