AsyncSocket簡介
在實現App的時候經常需要進行實時的網絡通信,也就是即時通信。
實現即時通信的方式很多,可以利用極光、融雲等即時通信平台進行通信,也可以利用一些打包類進行簡單的即時通信。這些打包類也有很多,例如 GCDAsyncSocket,AsyncSocket等等,但他們的使用方法都是共通的。這里以AsyncSocket為例,講解一下其使用過程。
AsyncSocket是一套開源的網絡訪問類庫。 iphone的標准推薦CFNetwork C庫編程.但是編程比較麻煩。在其它OS往往用類來封裝的對Socket函數的處理。比如MFC的CAsysncSocket,Java里面的 Socket和SocketServer.在iphone也有類似於開源項目,就是AsyncSocket庫, 官方網站:http://code.google.com/p/cocoaasyncsocket/ 它用來簡化CFnetwork的調用.
AsyncSocket的基本使用
在項目引入ASyncSocket庫
1.下載ASyncSocket庫源碼
2.把ASyncSocket庫源碼加入項目:
只需要增加RunLoop目錄中的AsyncSocket.h、AsyncSocket.m、AsyncUdpSocket.h和AsyncUdpSocket.m四個文件。
3.在項目增加CFNetwork框架
在Framework目錄右健,選擇Add—>Existing Files…, 選擇 CFNetwork.framework
連接服務器
首先引入頭文件,聲明一個AsyncSocket對象,再調用connection與服務器建立連接,代碼如下:
import “AsyncSocket.h”
然后就是與服務器建立鏈接了
// socket連接 -(void)socketConnectHost{ self.socket = [[AsyncSocket alloc] initWithDelegate:self]; NSError *error = nil; [self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:3 error:&error]; }
與Java中的客戶端部分代碼相似,AsyncSocket代碼也需要指定服務端地址和服務端口. ####發送數據 發送數據的代碼很簡單
NSString longConnect = @”longConnect”; NSData dataStream = [longConnect dataUsingEncoding:NSUTF8StringEncoding]; [self.socket writeData:dataStream withTimeout:1 tag:1];
AsyncSocket向服務器發送數據都是先將數據轉換生成二進制的data數據,再向服務端進行發送的。 ####接收數據 為了收到socket的消息,我們需要在長連接方法中進行讀取數據
[self.socket readDataWithTimeout:30 tag:0];
如果得到數據,會調用回調方法
-(void)onSocket:(AsyncSocket )sock didReadData:(NSData )data withTag:(long)tag
{
// 對得到的data值進行解析與轉換即可
}
AsyncSocket的中級使用
在進行通信的時候經常會遇到一些不可抗力的因素,例如:服務端崩潰,手機端App閃退,手機斷網了等等各種導致連接斷開,而一個優秀的App是不應該允許這些情況影響用戶體驗的。
這個時候可以采取的一種方式是:創建一個類,繼承AsyncSocket,重寫他的下列方法。
// Disconnect Implementation
(void)closeWithError:(NSError *)err;
(void)recoverUnreadData;
(void)emptyQueues;
(void)close;
在對應的方法中進行相應的容錯處理就可以了。