国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > JS > 正文

nodejs檢測(cè)因特網(wǎng)是否斷開的解決方案

2024-05-06 16:50:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

背景

最近在用Electron開發(fā)一款應(yīng)用,其中有涉及到檢測(cè)因特網(wǎng)是否斷開的需求。Electron基于Chromium和Node.js,讓你可以使用HTML、CSS和JavaScript構(gòu)建應(yīng)用。所以Electron提供nodejs、瀏覽器兩套運(yùn)行環(huán)境。

筆者最先考慮到的方案HTML5提供的online/offline網(wǎng)絡(luò)連接事件。

window.addEventListener('online', ...)window.addEventListener('offline', ...)

結(jié)論很失望,這兩個(gè)網(wǎng)絡(luò)連接事件,只是檢測(cè)本地網(wǎng)絡(luò)連接狀態(tài)。

既然瀏覽器沒(méi)有提供檢測(cè)因特網(wǎng)是否斷開的接口,筆者只能在nodejs尋求答案。

調(diào)研

說(shuō)到nodejs,筆者最先想到是去npm倉(cāng)庫(kù)搜索現(xiàn)有的庫(kù)。找到了兩款檢測(cè)因特網(wǎng)狀態(tài)的庫(kù)internet-available、is-online

internet-available

這個(gè)庫(kù)檢測(cè)因特網(wǎng)連接狀態(tài)原理,是檢測(cè)dns連接狀態(tài)。

這里大家肯定有個(gè)疑問(wèn),使用nodejs原生模塊dns不是更簡(jiǎn)潔嗎?

你說(shuō)的沒(méi)錯(cuò),nodejs確實(shí)提供這樣的方法,但是dns原生模塊并沒(méi)有提供超時(shí)檢測(cè)。internet-available可以設(shè)置超時(shí)參數(shù),默認(rèn)是5000ms(依賴dns-socket庫(kù)實(shí)現(xiàn)dns超時(shí),有興趣可以研究其源碼,這里不做展開)。

internet-available使用舉例:

var internetAvailable = require("internet-available");internetAvailable().then(function(){ console.log("Internet available");}).catch(function(){ console.log("No internet");});

如果想加入檢測(cè)次數(shù)和每次檢測(cè)超時(shí)時(shí)間,代碼如下:

var internetAvailable = require("internet-available");internetAvailable({ timeout: 4000, retries: 10,}).then(function(){ console.log("Internet available");}).catch(function(){ console.log("No internet");});

internet-available默認(rèn)檢測(cè)的DNS域名是google.com,如果想自定義域名,代碼如下:

var internetAvailable = require("internet-available");internetAvailable({ domainName: "xxxxx.com", port: 53, host: '8.8.8.8' // 默認(rèn),國(guó)內(nèi)請(qǐng)改成114.114.114.114}).then(() => { console.log("Internet available");}).catch(() => { console.log("No internet");});

備注:8.8.8.8是谷歌公司提供的免費(fèi)DNS服務(wù)器,該地址是全球通用,相對(duì)來(lái)說(shuō),更適合國(guó)外以及訪問(wèn)國(guó)外網(wǎng)站的用戶使用,國(guó)內(nèi)更適合用114.114.114.114。

is-online

is-online與internet-available檢測(cè)方式相同,唯一區(qū)別是is-online可以在nodejs和瀏覽器環(huán)境同時(shí)運(yùn)行。在瀏覽器環(huán)境下,通過(guò)navigator.onLine返回網(wǎng)絡(luò)連接狀態(tài),但與HTML5 online、offline事件一樣,只能檢測(cè)本地連接。

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"); }});

此庫(kù)也提供超時(shí)設(shè)置,且可以設(shè)置Internet協(xié)議版本,這是一個(gè)通常不需要設(shè)置的高級(jí)選項(xiàng),但它對(duì)于專門斷言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"); }});

總結(jié)

除了以上兩個(gè)庫(kù),還有其他方式可以檢測(cè)因特網(wǎng)斷開嗎?筆者目前想到的還可以通過(guò)發(fā)起http head請(qǐng)求是否成功響應(yīng)判斷;通過(guò)ping 目標(biāo)host或者domain是否連通檢測(cè)判斷。如果有更好的方式,歡迎討論~

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兖州市| 商丘市| 辉南县| 庆城县| 额济纳旗| 双峰县| 平安县| 南靖县| 喀喇沁旗| 陆河县| 嘉峪关市| 民丰县| 永胜县| 敦煌市| 武威市| 安顺市| 婺源县| 宁津县| 漠河县| 延长县| 宁波市| 高要市| 鄂温| 阿巴嘎旗| 垦利县| 新安县| 大新县| 奉节县| 修文县| 巫溪县| 望江县| 桐乡市| 班戈县| 易门县| 甘洛县| 沙河市| 霍山县| 江阴市| 从化市| 灵宝市| 兰西县|