iOS開発のAsyncSocketによるインスタント通信(一)

2453 ワード

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 4つのファイル.
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;
対応する方法で対応するフォールトトレランス処理を行えばよい.