在使用的中間碰到各種問題
首先是接收不到數據,其次是只能接收到一次數據,所以做一下總結
主要有以下幾種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即可