1. 程式人生 > >手機socket套接字75秒超時問題及解決方案

手機socket套接字75秒超時問題及解決方案

手機網路一個connect的一般在6秒內(正常wifi網路connect是1秒之內,一次測試的記錄是151毫秒,一次79毫秒)能建立成功(若10秒建立不成功,基本上就沒戲。我在華為時用受限網路connect時,發現最大超時能返回結果的時間是75秒後來我記錯了,記成90秒了。今年我換工作面試時和一個志同道合和的同行(面試官)說手機的socket套接字異常超時時間是90秒,它糾正說是75秒。若出現wifi閃斷或wifi網路和4g網路間切換,收到網路正常公告,立刻建立socket,由於網路虛電路還沒有穩定,可能超過30秒也建立不成功,需要再重新建立連線。今天我測試用我們公司的Geely-W受限wifi網路,connect75秒返回結果。
window系統soket預設超時時間是240秒,如文章

https://msdn.microsoft.com/zh-cn/library/aa560610中一個描述:降低客戶端 TCP/IP 套接字連線的超時值(預設值為 240 秒))。
若是既時通訊的軟體建立socket達到240秒才知道最終結果,那麼黃瓜菜都涼了,所以只要監控到sokcet套接字超過10秒不返回直接可以判它死罪,推倒重來。就是蘋果系統阻塞的執行緒不能立即結束,那麼我再起個執行緒還不行嗎?等你起醒來再幹掉你。
我寫的那個守護執行緒的文章(http://blog.csdn.net/jia12216/article/details/50016167)就是為了解決這種長連線,在那裡連啊連,就是姍姍來遲的問題。你消極我殺殺,直到你正常為止。
當然在連線前還是要判斷一下網路,若沒有網路,你連線到爪哇國去呀!
手機網路要比電腦網路差的多。如:
1.wifi訊號超過覆蓋區域自動切換到手機網路,收到網路異常通知,收不到網路正常通知;2.從沒有網路的地方進入wifi訊號覆蓋區,本手機又記錄了該wifi的資訊,自動接入 wifi又能正常訪問網路。
3.從沒有網路的地方進入wifi訊號覆蓋區,本手機又記錄了該wifi的資訊,自動接入 wifi卻不能正常訪問網路。
4.從沒有手機網路的地方進入有手機網路的區域。
5.從2g手機網路的地方進入有3g手機網路的區域。
6.從3g手機網路的地方進入有4g手機網路的區域。
當然也有手機切換到到後臺3到10分鐘內應用被掛起,長連線執行緒也嗝屁了。使用者把它從後臺救出來,那麼也要把這個掛起的長連線執行緒修理修理了。它們要通過守護執行緒處理這類socket套接字超時的問題。

Geely-W這類受限wifi網路的特點有,連線時有時候會自動彈出讓你輸入使用者名稱和密碼,有時候連線時又不彈出讓你輸入使用者名稱和密碼。當然無論彈出不彈出,你只要不輸入使用者名稱和密碼開啟網頁將失敗,並且它也會自動連線到這個wifi。當手機關閉4g網路,IOS手機連線到這樣的受限網路時,用[self.reachability stopNotifier];和[self.reachability startNotifier];重新檢查網路時,收到的kReachabilityChangedNotification通知是網路正常。江南大道東信路口那個公交站的那個aibinjiang的免費wifi也是類似的受限網路。
手機連線受限wifi網路,connect75秒超時的日誌(1449034518 - 1449034443):

2015-12-02 13:34:03:301 caocao[1925:1539773] SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1812 Debug:connect before:_connectTime = 1449034443, Thread Sno: 8

2015-12-02 13:34:04:071 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:04:072 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:04:072 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:04:074 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:04:075 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:08:199 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:08:200 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:08:200 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:08:200 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:08:200 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:17:204 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:17:205 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:17:205 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:17:205 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:17:207 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:19:445 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:19:445 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:19:445 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:19:445 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:19:445 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:28:365 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:28:366 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:28:366 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:28:366 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:28:366 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:30:548 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:30:548 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:30:548 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:30:548 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:30:548 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:39:534 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:39:534 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:39:534 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:39:535 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:39:535 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:40:192 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:40:193 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:40:193 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:40:193 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:40:194 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:49:189 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:49:189 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:49:190 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:49:190 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:49:191 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:34:53:179 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:53:179 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:53:179 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:34:53:180 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:34:53:180 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:35:02:168 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:02:168 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:02:168 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:02:169 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:02:169 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:35:04:379 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:04:379 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:04:379 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:04:379 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:04:379 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:35:13:369 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:13:369 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:13:369 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:13:369 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:13:369 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015-12-02 13:35:15:626 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:15:626 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:15:627 caocao[1925:1539695] Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015-12-02 13:35:15:630 caocao[1925:1539695] Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015-12-02 13:35:15:631 caocao[1925:1539695] Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
socket: Operation timed out
2015-12-02 13:35:18:366 caocao[1925:1539773] SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1816 Debug:connect after:_connectTime = 1449034518, Thread Sno: 8

4G手機網路在公交車行駛過程中,connect(連線前時間記錄1449014484),connect時間間為6秒的日誌(1449014510 - 1449014504),連線前的時間(1449014484)單位是秒,連線成功後列印的時間(1449014500)單位是毫秒:

2015/12/02 08:01:24:863  SingleAsyncSocket.m:-[SingleAsyncSocket reachabilityDidChanged:]:1357 Debug:handleNetChanged
2015/12/02 08:01:24:863  SingleAsyncSocket.m:-[SingleAsyncSocket reachabilityDidChanged:]:1367 Debug:收到網路正常通知。 網路狀態:2
2015/12/02 08:01:24:870  StartOrderViewController.m:-[StartOrderViewController reachabilityRecove:]:153 Debug:函式
2015/12/02 08:01:24:871  MainViewController.m:-[MainViewController reachabilityRecove:]:746 Debug:函式
2015/12/02 08:01:24:872  SingleAsyncSocket.m:-[SingleAsyncSocket sendWiFiWWANChangeSocket]:692 Debug:函式
2015/12/02 08:01:24:875  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函式
2015/12/02 08:01:24:875  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函式
2015/12/02 08:01:24:875  SingleAsyncSocket.m:-[SingleAsyncSocket reachabilityDidChanged:]:1342 Debug:函式
2015/12/02 08:01:24:875  SingleAsyncSocket.m:-[SingleAsyncSocket setNetworkStatus:]:103 Debug:函式
2015/12/02 08:01:24:875  SingleAsyncSocket.m:-[SingleAsyncSocket reachabilityDidChanged:]:1357 Debug:handleNetChanged
2015/12/02 08:01:24:876  SingleAsyncSocket.m:-[SingleAsyncSocket reachabilityDidChanged:]:1367 Debug:收到網路正常通知。 網路狀態:2
2015/12/02 08:01:24:876  StartOrderViewController.m:-[StartOrderViewController reachabilityRecove:]:153 Debug:函式
2015/12/02 08:01:24:876  MainViewController.m:-[MainViewController reachabilityRecove:]:746 Debug:函式
2015/12/02 08:01:24:877  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2020 Debug:ret2= 1
2015/12/02 08:01:24:877  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函式
2015/12/02 08:01:24:877  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函式
2015/12/02 08:01:24:877  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2130 Debug:i= 0
2015/12/02 08:01:24:877  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2291 Debug:ret4= 0
2015/12/02 08:01:24:877  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2293 Debug:i= 0
2015/12/02 08:01:24:877  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2322 Debug:ret2= 2
2015/12/02 08:01:24:877  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2334 Debug:data:,net change
2015/12/02 08:01:24:877  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2355 Debug:收到傳送訊息管道訊息:,net change
2015/12/02 08:01:24:886  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1648 Debug:SKIP fd= 49
2015/12/02 08:01:24:886  Singleton.m:-[Singleton getLoginOrderStat]:265 Debug:函式
2015/12/02 08:01:24:888  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1733 Debug:socket sucess 
2015/12/02 08:01:24:888  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1734 Debug:g_fd= 49
2015/12/02 08:01:24:888  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1739 Debug:main loop 
2015/12/02 08:01:24:888  Singleton.m:-[Singleton getLoginOrderStat]:265 Debug:函式
2015/12/02 08:01:24:888  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函式
2015/12/02 08:01:24:888  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函式
2015/12/02 08:01:24:888  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1806 Debug:_connectTime = 1449014484
2015/12/02 08:01:24:889  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2594 Debug:ret = 1
2015/12/02 08:01:24:889  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2606 Debug:pipe data:GuardThreadStartMonitor:10;
2015/12/02 08:01:24:889  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2632 Debug:收到守護執行緒開始監控的訊息,開始實時監控長連線執行緒:GuardThreadStartMonitor:10;
2015/12/02 08:01:25:254  Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015/12/02 08:01:25:255  Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015/12/02 08:01:25:255  Singleton.m:-[Singleton setUsingCoordatesFlag:]:605 Debug:函式
2015/12/02 08:01:25:255  Singleton.m:-[Singleton setCanModifyCoordatesFlag:]:633 Debug:函式
2015/12/02 08:01:25:255  Singleton.m:-[Singleton setCanModifyCoordatesFlag:]:633 Debug:函式
2015/12/02 08:01:25:255  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:73 Debug:函式
2015/12/02 08:01:25:255  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:76 Debug:latitude:30.182394, longitude:120.158524;
2015/12/02 08:01:25:255  Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015/12/02 08:01:25:256  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:105 Debug:latitude:30.182394, longitude:120.158524;_lastLatitude:30.182394,_lastLongitude:120.158524; locationDistance:0.000000米
2015/12/02 08:01:25:256  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:118 Debug:latitude:30.182394, longitude:120.158524;_lastLatitude:30.182394,_lastLongitude:120.158524; locationDistance:0.000000米
2015/12/02 08:01:25:256  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:120 Debug:[GlobalShare getGlobalShare].user.orderTotalDistance 0.480011
2015/12/02 08:01:25:256  GlobalShare.m:-[GlobalShare saveinfo:]:60 Debug:函式
2015/12/02 08:01:25:265  Singleton.m:-[Singleton setUsingCoordatesFlag:]:605 Debug:函式
2015/12/02 08:01:25:265  MainViewController.m:-[MainViewController amapLocationManager:didUpdateLocation:]:306 Debug:userLocation.coordinate latitude: 30.182394, longitude:120.158524, horizontalAccuracy:10.000000, speed:0.000000
2015/12/02 08:01:26:251  Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函式
2015/12/02 08:01:26:251  Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函式
2015/12/02 08:01:26:252  Singleton.m:-[Singleton setUsingCoordatesFlag:]:605 Debug:函式
2015/12/02 08:01:26:252  Singleton.m:-[Singleton setCanModifyCoordatesFlag:]:633 Debug:函式
2015/12/02 08:01:26:252  Singleton.m:-[Singleton setCanModifyCoordatesFlag:]:633 Debug:函式
2015/12/02 08:01:26:252  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:73 Debug:函式
2015/12/02 08:01:26:252  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:76 Debug:latitude:30.182394, longitude:120.158524;
2015/12/02 08:01:26:253  Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函式
2015/12/02 08:01:26:253  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:105 Debug:latitude:30.182394, longitude:120.158524;_lastLatitude:30.182394,_lastLongitude:120.158524; locationDistance:0.000000米
2015/12/02 08:01:26:253  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:118 Debug:latitude:30.182394, longitude:120.158524;_lastLatitude:30.182394,_lastLongitude:120.158524; locationDistance:0.000000米
2015/12/02 08:01:26:253  Singleton.m:-[Singleton setLocationWithLatitude:longitude:horizontalAccuracy:speed:]:120 Debug:[GlobalShare getGlobalShare].user.orderTotalDistance 0.480011
2015/12/02 08:01:26<