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抓取html页面内容(推荐)
Aug 11 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 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
世界上第一台立体声收音机
2021/03/01 无线电
用PHP编写和读取XML的几种方式
2013/01/12 PHP
php注册登录系统简化版
2020/12/28 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
php探针不显示内存解决方法
2019/09/17 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
js实现简单计算器
2015/11/22 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
JavaScript动态加载重复绑定问题
2018/04/01 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
python实现简单的计时器功能函数
2015/03/14 Python
Python中文竖排显示的方法
2015/07/28 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
基于python实现文件加密功能
2020/01/06 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
Python实现扫码工具的示例代码
2020/10/09 Python
python openssl模块安装及用法
2020/12/06 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
党组织公开承诺书
2014/03/29 职场文书
小学运动会开幕词
2016/03/04 职场文书
诚信高考倡议书
2019/06/24 职场文书