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服务器(6):作出响应
Dec 18 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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使用smtp发送支持附件的邮件示例
2014/04/13 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
python enumerate函数的使用方法总结
2017/11/15 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
python图形用户接口实例详解
2019/12/16 Python
python实现超级玛丽游戏
2020/03/18 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
幼儿园园长岗位职责
2013/11/26 职场文书
销售冠军获奖感言
2014/02/03 职场文书
青春演讲稿范文
2014/05/08 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
医院保洁员管理制度
2015/08/05 职场文书
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript