Android网络收集和ping封装库
- 可以的
- StethoInterceptor大概流程
- 整個流程我們可以簡化為:發送請求時,給Chrome發了條消息,收到請求時,再給Chrome發條消息(具體怎么發的可以看NetworkEventReporterImpl的實現)
- 兩條消息通過EventID聯系起來,它們的類型分別是OkHttpInspectorRequest 和 OkHttpInspectorResponse,兩者分別繼承自NetworkEventReporter.InspectorRequest和NetworkEventReporter.InspectorResponse。
- 我們只要也繼承自這兩個類,在自己的網絡庫發送和收到請求時,構造一個Request和Response并發送給Chrome即可。
- 如何拿來用
- 既然Android中使用到facebook的stetho庫,可以攔截手機請求請求,然后去Chrome瀏覽器,在瀏覽器地址欄輸入:chrome://inspect 。即可查看請求信息。
- 那么能不能把這個拿到的請求信息,放到集合中,然后在Android的頁面中展示呢?這樣方便開發和測試查看網絡請求信息,以及請求流程中的消耗時間(比如dns解析時間,請求時間,響應時間,共耗時等等)
- 如何消耗記錄時間
- 在OkHttp庫中有一個EventListener類。該類是網絡事件的偵聽器。擴展這個類以監視應用程序的HTTP調用的數量、大小和持續時間。
- 所有啟動/連接/獲取事件最終將接收到匹配的結束/釋放事件,要么成功(非空參數),要么失敗(非空可拋出)。
- 比如,可以在開始鏈接記錄時間;dns開始,結束等方法解析記錄時間,可以計算dns的解析時間。
- 比如,可以在開始請求記錄時間,記錄connectStart,connectEnd等方法時間,則可以計算出connect連接時間。
04.如何使用
- 如下所示
new OkHttpClient.Builder()
//配置工廠監聽器。主要是計算網絡過程消耗時間
.eventListenerFactory(NetworkListener.get())
//主要是處理攔截請求,響應等信息
.addNetworkInterceptor(new StethoInterceptor())
.build()
- 該庫目的
- 做成懸浮全局按鈕,點擊按鈕可以查看該activity頁面請求接口,可以查看請求幾個接口,以及接口請求到響應消耗流量
- 方便查看網絡請求流程,比如dns解析時間,請求時間,響應時間
- 方便測試查看請求數據,方便抓包??梢詮椭苧equest,respond,body等內容。也可以截圖
- 待完善功能
- 添加ping功能,通過ping檢測網絡問題,幫助診斷
- 需要弄一個懸浮按鈕,即添加跳轉網路攔截list入口
- 網絡請求響應超過1秒后(也可能是2秒),需要給提示,便于那種網絡超時
05.案例截圖如下
06.網絡請求接口信息
- 請求接口如下所示
- [www.wanandroid.com/friend/json](()
- General
- Request URL: [www.wanandroid.com/friend/json](()
- Request Method: GET
- Status Code: 200 OK
- Remote Address: 47.104.74.169:443
- Referrer Policy: no-referrer-when-downgrade
- Response Header
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Cache-Control: private
- Expires: Thu, 01 Jan 1970 08:00:00 CST
- Content-Type: application/json;charset=UTF-8
- Transfer-Encoding: chunked
- Date: Thu, 10 Sep 2020 01:05:47 GMT
- Request Header
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
- Accept-Encoding: gzip, deflate, br
- Accept-Language: zh-CN,zh;q=0.9
- Cache-Control: no-cache
- Connection: keep-alive
- Cookie: JSESSIONID=5D6302E64E9734210FA231A6FAF5799E; Hm_lvt_90501e13a75bb5eb3d067166e8d2cad8=1598920692,1599007288,1599094016,1599629553; Hm_lpvt_90501e13a75bb5eb3d067166e8d2cad8=1599699419
- Host: [www.wanandroid.com](()
- Pragma: no-cache
- Sec-Fetch-Dest: document
- Sec-Fetch-Mode: navigate
- Sec-Fetch-Site: none
- Upgrade-Insecure-Requests: 1
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
- Response返回body
- 這里省略
- 看截圖如下
07.如何使用ping
-
ping的使用截圖
-
ping是一個工具
-
Ping是Windows、Unix和Linux系統下的一個命令。ping也屬于一個通信協議,是TCP/IP協議的一部 《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》無償開源 徽信搜索公眾號【編程進階路】 分。
-
利用“ping”命令可以檢查網絡是否連通,可以很好地幫助我們分析和判定網絡故障。
-
Ping發送一個ICMP(Internet Control Messages Protocol)即因特網信報控制協議,回聲請求消息給目的地并報告是否收到所希望的ICMP echo (ICMP回聲應答),用來檢查網絡是否通暢或者網絡連接速度的命令。廣義來說即發送一個數據包,根據返回的數據包得到丟包率及平均時間得出網絡的連接狀態。
-
ping的作用有哪些
-
我們可能都會遇到網站打不開,當出現不開的時候,我們也不知道是那里出了問題,不知道是不是解析出了問題還是網站的空間出了問題,這時候我們就可以通過ping來查找問題,看看網站能不能ping的通。
-
ping在Android的應用
-
為了檢查網絡,在android上也可以通過ping來查看是否網絡通。
-
實現方案有哪些
-
通過后臺線程執行ping命令的方式模擬traceroute的過程,缺點就是模擬過程較慢,timeout的出現比較頻繁
-
通過編譯開源網絡檢測庫iputilsC代碼的方式對traceroute進行了套接字發送ICMP報文模擬,可以明顯提高檢測速度
-
深入理解iputils網絡工具:[blog.csdn.net/fsdev/categ…](()
-
關于代碼ping的過程信息
-
開啟一個AsyncTask,在doInBackground方法中開始解析,這個是入口。
-
添加頭部信息,主要包括:開始診斷 + 輸出關于應用、機器、網絡診斷的基本信息 + 輸出本地網絡環境信息
-
tcp三次握手操作
-
開始執行鏈接,這里有兩個重要信息。一個是ip集合,另一個是InetAddress數組,遍歷【長度是ip集合length】,然后執行請求
-
創建socketAddress,有兩個參數,一個是ip,一個是端口號80,然后for循環執行socket請求
-
在執行socket請求的時候,如果有監聽到超時SocketTimeoutException異常則記錄數據,如果有異常則記錄數據
-
當出現發生timeOut,則嘗試加長連接時間,注意連續兩次連接超時,停止后續測試。連續兩次出現IO異常,停止后續測試
-
當然只要有一次完整執行成功的流程,那么則記錄三次握手操作成功
-
診斷ping信息, 同步過程。這個主要是直接通過ping命令監測網絡
-
創建一個NetPing對象,設置每次ping發送數據包的個數為4個
-
然后ping本機ip地址,ping本地網觀ip地址,ping本地dns。這個ping的指令是啥?這個主要是用java中的Runtime執行指令……
-
開始診斷traceRoute
-
先調用原生jni代碼,調用jni c函數執行traceroute過程。如果發生了異常,再調用java代碼執行操作……
-
然后通過ping命令模擬執行traceroute的過程,比如:ping -c 1 -t 1 [www.jianshu.com](()
-
如果成功獲得trace:IP,則再次發送ping命令獲取ping的時間
-
在該項目中如何使用ping
-
直接創建一個ping,需要傳遞一個網址url
_netDiagnoService = new NetDiagnoService(getContext(), getContext().getPackageName()
, versionName, userId, deviceId, host, this);
_netDiagnoService.execute();
-
如何取消ping
tContext(), getContext().getPackageName()
, versionName, userId, deviceId, host, this);
_netDiagnoService.execute(); -
如何取消ping
總結
以上是生活随笔為你收集整理的Android网络收集和ping封装库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信H5扫码支付 java
- 下一篇: android sdk的封装,Andro