GCDAsyncSocket 使用心得


在使用的中間碰到各種問題

首先是接收不到數據,其次是只能接收到一次數據,所以做一下總結

 

主要有以下幾種delegate

A:- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port;
B:- (void)onSocketDidSecure:(AsyncSocket *)sock;
C:- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;
D:- (void)onSocketDidDisconnect:(AsyncSocket *)sock;
E:- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

 

監聽網絡操作

如果鏈接成功會調用A   

如果我們想讀取數據  就在A方法中  加入[socket readDataWithTimeout:-1 tag:0];  當收到數據的時候  會調用E  當調用E之后 我們的這個讀取請求就完成了

不再監聽網絡, 若想一直監聽網絡  在E中 也加入[socket readDataWithTimeout:-1 tag:0]; 

 

這個庫若想監聽網絡,必須先設置[socket readDataWithTimeout:-1 tag:0];這里面的tag很重要。如果你寫的時候用的tag與讀的不相同,那么永遠在回調的地方沒有回復。
當讀的時候,需要判斷長度是否足夠,如果不夠需要再次設置[socket readDataWithTimeout:-1 tag:0];
如果你需要保持這條鏈路,就不要用它的超時,因為默認超時,會斷開連接。你再超時回調處,再次設置時間,也只是延長等待時間,到點仍是斷鏈。

 

cilent向主機發送命令,每次發送一條后 主動斷開

connectToHost:這個方法會返回一個bool  但是每次都返回yes   原因是這個方法yes  與no  表示 是否嘗試着去鏈接host  並不代表是否鏈接成功

所以要想知道是否鏈接成功  要看是否調用了A方法

如果我們寫如下的代碼 

-(void)xxxxxxxxpressed:(xxx)xxxx{

 [socket  connectToHost:h onPort:p withTimeout:-1error:&error ];

 [socket  writeData:currentConmandwithTimeout:-1tag:button.tag];

[socket disconnectAfterWriting];

}

每次事件發生的時候  進行鏈接  並且馬上發送數據,然后 等Writing結束后  撤銷鏈接  這樣在100%能鏈接上的情況下是沒有問題的

但是 當主機出現問題  鏈接不上的時候, connectToHost:之后 馬上寫入數據,但是這個寫入請求永遠不會完成,所以之后的disconnectAfterWriting

一直會等待下去不執行,則這個connect仍然處於鏈接失敗 狀態。

當下一次事件發生的時候,會再次鏈接,這時程序崩潰,錯誤信息是告訴我們  必須先disconnect之后 才能再次鏈接

原因是 connect失敗導致寫入無法完成,所以disconnectAfterWriting 也就無法完成

解決辦法 在 這個方法的最開始 加入幾句代碼

 [socketsetDelegate:nil];

        [socket disconnect];

        socket=nil;

然后每次都重新初始化一次socket即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM