iOS開發之利用AsyncSocket實現即時通信(一)

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;

在對應的方法中進行相應的容錯處理就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章