因?yàn)轫?xiàng)目中用用到socket通信 實(shí)現(xiàn)夸平臺(tái)的局域網(wǎng)實(shí)時(shí)通信桥温。下面羅列一些我在使用過(guò)程中遇見(jiàn)錯(cuò)誤和我的處理方式:一般socket通信的錯(cuò)誤都會(huì)傳到- (void)socketDidDisconnect:(GCDAsyncSocket*)sock withError:(NSError*)error 這個(gè)代理方法中
1.Error Domain=GCDAsyncSocketErrorDomain Code=4 "Read operation timed out" UserInfo=0xa8db6a0 {NSLocalizedDescription=Read operation timed out}
scoket讀取數(shù)據(jù)超時(shí)墓猎,當(dāng)網(wǎng)絡(luò)不怎么穩(wěn)定通信方給發(fā)送消息的時(shí)候時(shí)不時(shí)的會(huì)冒一個(gè)這個(gè)錯(cuò)誤嗅剖,而且Socket也會(huì)自動(dòng)斷開(kāi)連接。一直跟蹤GCDAsyncSocket.m的代碼5068行<可能代碼有更新的會(huì)有點(diǎn)差異>有一個(gè)方法
- (void)setupReadTimerWithTimeout:(NSTimeInterval)timeout
這個(gè)方法是就是專(zhuān)門(mén)監(jiān)聽(tīng)socket讀取數(shù)據(jù)是否有超時(shí)的現(xiàn)象的方法,源代碼設(shè)置成if(timeout >=0.0)即檢測(cè)到超時(shí)就拋異常 這樣很容易導(dǎo)致socket連接異常弟胀。
處理方式:你可以打印一下這個(gè)timeout值沛励,就會(huì)大概知道你的socket讀取數(shù)據(jù)超時(shí)的范圍匹涮,在項(xiàng)目允許的范圍內(nèi)設(shè)置這個(gè)值的大小吁断,因?yàn)槲业捻?xiàng)目總是在10以?xún)?nèi)趁蕊,所以我設(shè)置成if(timeout >10.0)之后,基本運(yùn)行的時(shí)候就很少拋這個(gè)異常了仔役。你也可以再接收到這個(gè)異常的時(shí)候重新連接一次掷伙。
2.Error Domain=GCDAsyncSocketErrorDomain Code=3 "Attempt to connect to host timed out" UserInfo=0x7bd14f40 {NSLocalizedDescription=Attempt to connect to host timed out}
socket連接的時(shí)候超時(shí),一般發(fā)生在你向服務(wù)端發(fā)送一條連接消息的時(shí)候又兵,服務(wù)端無(wú)響應(yīng)炎咖,一般是由于服務(wù)端沒(méi)有開(kāi)啟服務(wù),也有可能是設(shè)置響應(yīng)時(shí)間的timeout值過(guò)小寒波,在GCDAsyncSocket.m的代碼1938行的位置有一個(gè)設(shè)置timeout的地方 你可以設(shè)置一個(gè)稍微比較長(zhǎng)的響應(yīng)時(shí)間
- (BOOL)connectToHost:(NSString*)host onPort:(uint16_t)port error:(NSError**)errPtr
{
return[selfconnectToHost:hostonPort:portwithTimeout:5error:errPtr];
}
3.Error Domain=GCDAsyncSocketErrorDomain Code=51,網(wǎng)絡(luò)斷開(kāi)升熊,可以檢查一下網(wǎng)絡(luò)連接狀態(tài)
4.Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused" UserInfo=0x7b288750 {NSLocalizedFailureReason=Error in connect() function, NSLocalizedDescription=Connection refused}
服務(wù)器沒(méi)啟動(dòng)俄烁,或者端口沒(méi)開(kāi)啟。