
背景
我目前正在用Electron开发一个应用程序,其中涉及需要检测Internet是否断开连接. Electron基于Chromium和Node.js,使您可以使用HTML,CSS和JavaScript来构建应用程序. 因此,Electron提供了两种操作环境node自动断开,nodejs和浏览器.
作者首先考虑了HTML5提供的/离线网络连接事件.
window.addEventListener('online', ...)
window.addEventListener('offline', ...)
结论非常令人失望. 这两个网络连接事件仅用于检测本地网络连接状态.

由于浏览器没有提供检测Internet是否断开连接的界面,所以我只能在nodejs中寻求答案.
研究
说到nodejs,作者的第一个想法是在npm仓库中搜索现有的库. 我发现有两个图书馆可以通过互联网访问,并且可以检测互联网状态
互联网可用
此库检测Internet连接状态的原理是检测dns连接状态.

每个人都必须在这里提出问题. 使用nodejs本机模块dns更加简洁吗?
是的,nodejs确实提供了这种方法node自动断开,但是dns本机模块不提供超时检测. internet-available可以设置timeout参数,默认值为5000ms(依靠dns-socket库实现dns超时,如果您有兴趣,可以研究其源代码,在这里不做扩展).
互联网可用示例:
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");
});
互联网可用的默认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是Google提供的免费DNS服务器. 该地址是通用的. 相对而言,它更适合于外国用户和访问外国网站的用户,而114.114.114.114更适合于国内用户.
is-online和Internet-available的检测方法相同,唯一的区别是is-online可以同时在nodejs和浏览器环境中运行. 在浏览器环境中,网络连接状态通过navigator.onLine返回,但是像HTML5联机和脱机事件一样,只能检测到本地连接.
使用示例
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");
}
});
摘要
除了上述两个库之外,还有其他方法可以检测到Internet断开连接吗?目前,作者还可以判断是否成功响应了HTTP标头请求. 并判断是否通过ping连接了目标主机或域. 如果有更好的方法,欢迎讨论〜
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-288392-1.html
让台独份子折腾吧
国际多极化全面战争不可能爆发局部冲突在所难免坚决反对可能出现的类似的奇葩解决方式
而且这次派出的052D也是旧军舰了