nodejs检测因特网是否断开的解决方案
作者:苏格团队 发布时间:2024-05-13 10:04:25
背景
最近在用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是否连通检测判断。如果有更好的方式,欢迎讨论~
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对asp之家的支持。
来源:https://juejin.im/post/5cb5d6d6518825324f68cb20
猜你喜欢
- 本文实例总结了php遍历目录方法。分享给大家供大家参考。具体如下:1. 方法1 <?p
- 索引是加速表内容访问的主要手段,特别对涉及多个表的连接的查询更是如此。这是数据库优化中的一个重要内容,我们要了解为什么需要索引,索引如何工作
- 本文实例讲述了Python实现的旋转数组功能算法。分享给大家供大家参考,具体如下:一、题目给定一个数组,将数组中的元素向右移动 k 个位置,
- 在Python探索之SocketServer详解中我们介绍了Python标准库中的SocketServer模块,了解了要实现网络通信服务,就
- 本文实例讲述了Python模块、包(Package)概念与用法。分享给大家供大家参考,具体如下:Python中”模块”的概念在开发中,我们会
- 执行以下SQL,即OK咯叻!! SQL:alter database 数据库名称 SQL_Latin1_General_CP1_CI_AS
- 目录1. 将索引从 groupby 操作转换为列2. 使用现有的 DataFrame 设置索引3. 一些操作后重置索引4.排序后重置索引5.
- 描述符类要求:描述符就是将某种特殊类型的类的实例指派给另一个类的属性至少要实现以下的一个方法:•__get__(self, instance
- 1 概述C/C++和Java(以及大多数的主流编程语言)都有自己成熟的单元测试框架,前者如Check,后者如JUnit,但这些编程框架本质上
- 描述的意思是HTML为中心的前端开发也差不多是web标准的意思。1.HTML是基础2.CSS依靠选择符提供视觉;3.Javascript 依
- 任务说明:编写一个钱币定位系统,其不仅能够检测出输入图像中各个钱币的边缘,同时,还能给出各个钱币的圆心坐标与半径。效果代码实现Canny边缘
- 1.安装Apache 在终端中输入下面的命令就可以安装Apache了:sudo yum install httpdsudo的意思是
- 1.用户输入月份,判断这个月是哪个季节month = int(input('Month:'))if month in [3,
- 一、建立文件,保存数据1.使用python中内置的open函数 打开txt文件#mode 模式#w 只能操作写入 r 只能读取 a 向文件追
- 概述如果你已经阅读过上一个章节,那么你应该已经完成了充分的准备工作并且创建了一个很简单的具有如下文件结构的Web应用: 
- 最近有个部署需求,需要读取py文件格式的配置项,我的实现思路是把配置文件解析到内存中。主要使用两种方法:importlib.import_m
- vue3挂载并使用axios首先在main.js中引入axios并挂载到app.config.globalProperties上axios配
- 工作中,我们经常会遇到数据异常,比如说浏览量突增猛降,交易量突增猛降,但是这些数据又不是符合正太分布的,如果用几倍西格玛就不合适,那么我们如
- 很久之前曾经总结过一篇博客“MySQL如何找出未提交事务信息”,现在看来,这篇文章中不少知识点或观点都略显肤浅,或者说不够深入,甚至部分结论
- 前言今天在学习python的过程中,发现python没有switch这个语法。于是就想在python中如何才能实现这个功能呢?正文本文中我们