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 url验证(url-valid)的使用方法
Nov 18 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 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 常用类汇总 推荐收藏
2010/05/13 PHP
php调用shell的方法
2014/11/05 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
js opener的使用详解
2014/01/11 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
python创建学生成绩管理系统
2019/11/22 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
《画杨桃》教学反思
2014/04/13 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
早恋主题班会
2015/08/14 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android