因為項目中用用到socket通信 實現夸平臺的局域網實時通信。下面羅列一些我在使用過程中遇見錯誤和我的處理方式:一般socket通信的錯誤都會傳到- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)error 這個代理方法中
1.Error Domain=GCDAsyncSocketErrorDomain Code=4 "Read operation timed out" UserInfo=0xa8db6a0 {NSLocalizedDescription=Read operation timed out}
scoket讀取數據超時,當網絡不怎么穩定通信方給發送消息的時候時不時的會冒一個這個錯誤,而且Socket也會自動斷開連接。一直跟蹤GCDAsyncSocket.m的代碼5068行<可能代碼有更新的會有點差異>有一個方法
- (void)setupReadTimerWithTimeout:(NSTimeInterval)timeout
這個方法是就是專門監聽socket讀取數據是否有超時的現象的方法,源代碼設置成if(timeout >= 0.0)即檢測到超時就拋異常 這樣很容易導致socket連接異常。
處理方式:你可以打印一下這個timeout值,就會大概知道你的socket讀取數據超時的范圍,在項目允許的范圍內設置這個值的大小,因為我的項目總是在10以內,所以我設置成if(timeout > 10.0)之后,基本運行的時候就很少拋這個異常了。你也可以再接收到這個異常的時候重新連接一次。
2.Error Domain=GCDAsyncSocketErrorDomain Code=3 "Attempt to connect to host timed out" UserInfo=0x7bd14f40 {NSLocalizedDescription=Attempt to connect to host timed out}
socket連接的時候超時,一般發生在你向服務端發送一條連接消息的時候,服務端無響應,一般是由于服務端沒有開啟服務,也有可能是設置響應時間的timeout值過小,在GCDAsyncSocket.m的代碼1938行的位置有一個設置timeout的地方 你可以設置一個稍微比較長的響應時間
- (BOOL)connectToHost:(NSString*)host onPort:(uint16_t)port error:(NSError **)errPtr
{
return [self connectToHost:host onPort:port withTimeout:5 error:errPtr];
}
3.Error Domain=GCDAsyncSocketErrorDomain Code=51,網絡斷開,可以檢查一下網絡連接狀態
4.Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused" UserInfo=0x7b288750 {NSLocalizedFailureReason=Error in connect() function, NSLocalizedDescription=Connection refused}
服務器沒啟動,或者端口沒開啟。