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(二)--- Node.js事件模块
May 21 NodeJs
基于promise.js实现nodejs的promises库
Jul 06 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 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/02 无线电
新版PHP将向Java靠拢
2006/10/09 PHP
浅谈php自定义错误日志
2015/02/13 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
python计算两个地址之间的距离方法
2018/06/09 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
Python扫描端口的实现
2021/01/25 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
职业生涯规划书基本格式
2014/01/06 职场文书
社区党务公开实施方案
2014/03/18 职场文书
青春无悔演讲稿
2014/05/08 职场文书
教师教学评估方案
2014/05/09 职场文书
旅游文化节策划方案
2014/06/06 职场文书
民事答辩状范本
2015/05/21 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript