日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 物聯(lián)網(wǎng) > 網(wǎng)絡協(xié)議
[導讀] 如今開發(fā)的app沒有不用到網(wǎng)絡的,所以對當前網(wǎng)絡狀態(tài)的準確把控就尤為重要了。經(jīng)常有這樣的場景:獲取手機當前網(wǎng)絡類型、是否連接Wi-Fi、是否能夠訪問外網(wǎng)(英特網(wǎng))。今天我們要說的就是如何判斷手機

如今開發(fā)的app沒有不用到網(wǎng)絡的,所以對當前網(wǎng)絡狀態(tài)的準確把控就尤為重要了。經(jīng)常有這樣的場景:獲取手機當前網(wǎng)絡類型、是否連接Wi-Fi、是否能夠訪問外網(wǎng)(英特網(wǎng))。今天我們要說的就是如何判斷手機是否能夠與服務器通信。

Note: 本文所有代碼均是基于kotlin語言實現(xiàn)

1.錯誤方法

在寫代碼前,先在網(wǎng)上搜索了主流的解決方案,發(fā)現(xiàn)大家都是前篇一律的思路:使用NetworkInfo中的一個狀態(tài)(State)是否是連接狀態(tài)來判斷,但是結果是殘酷的,該方法是用來判斷是否連接了Wi-Fi,并不能表示手機連接了互聯(lián)網(wǎng)。不過我也把代碼貼出來,供大家參考:

2.正確方法

權限:

<uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>

方案一:ping服務器地址(簡單)

通過ping命令的返回結果來得知是否連接外網(wǎng),現(xiàn)在主流有效的方法均是這個原理,只是大部分都是ping的百度的地址,這里推薦使用8.8.8.8,示例代碼如下:

PS:8.8.8.8是一個dns服務器地址,是Google提供的免費DNS服務器的IP地址。
這個方案的優(yōu)點是:

可以運行在主線程,且是同步的

速度快

缺點也有:

在一些老的手機上并不起效,比如Galaxy S3,原因是跟手機的OEM有關,具體原因可以參考:Why does ping works on some devices and not others?

方案二:連接服務器端口(推薦)

使用socket連接服務器的一個端口,并通過連接的結果來判斷手機是否連接外網(wǎng),推薦使用該方法,因為該方法適用于所有的手機Android版本,示例代碼如下:

funisOnline() =try{valTImeoutMs =1500Socket().use{//連接的端口不同,網(wǎng)絡協(xié)議不同。 DNS:53;HTTP:80valsocketAddr = InetSocketAddress("8.8.8.8",53) it.connect(socketAddr, TImeoutMs) }true} catch (e: Throwable) {false}

優(yōu)點:

速度快,非???/p>

方法通吃,沒有煩人的版本適配

缺點:

不能在主線程中運行

方案三:根據(jù)域名獲取IP(推薦)

使用InetAddress提供的方法getByName()獲取某個域名的IP地址,然后根據(jù)是否獲取的成功來判斷是否連接外網(wǎng)。推薦使用該方法。

優(yōu)點:

速度快,超時可自定義

可運行在主線程

各個版本通吃

缺點:

暫無

3.總結

其實以上有效的三個方案的思路都是一樣的:

進行一次網(wǎng)絡訪問(必須訪問公網(wǎng)的一個地址,無論是域名或者IP地址)

根據(jù)網(wǎng)絡返回的結果進行實際判斷

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉