CFNetworkによるネットワーク通信
サーバとのTCP接続を確立するもう1つの手段としてCFNetworkフレームワークがあります。CFNetworkはCore Servicesレイヤのフレームワークの1つ(実体はCライブラリ)で、ネットワークプロトコル(HTTP、FTP、BSDソケットなど)を処理するために必要な抽象化を行います。
CFNetworkフレームワークの各クラスの使い方を見てみましょう。以下のステートメントをNetworkViewController.mファイルに追加します。
#import "NetworkViewController.h" #import "NSStreamAdditions.h" #import @implementation NetworkViewController NSMutableData *data; NSInputStream *iStream; NSOutputStream *oStream; CFReadStreamRef readStream = NULL; CFWriteStreamRef writeStream = NULL;
connectToServerUsingCFStream:portNo:メソッドをリスト2のように定義します。
-(void) connectToServerUsingCFStream:(NSString *) urlStr portNo: (uint) portNo {
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) urlStr,
portNo,
&readStream,
&writeStream);
if (readStream && writeStream) {
CFReadStreamSetProperty(readStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
iStream = (NSInputStream *)readStream;
[iStream retain];
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
oStream = (NSOutputStream *)writeStream;
[oStream retain];
[oStream setDelegate:self];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream open];
}
}
最初にCFStreamCreatePairWithSocketToHost()メソッドを使用して、サーバにTCP/IPで接続された読み書き可能なストリームを作成します。このメソッドは読み取り用のストリーム(readStream)と書き込み用のストリーム(writeStream)への参照を返します。これを型変換することで、Objective Cにおけるそれぞれのストリーム(NSInputStream、NSOutputStream)が得られます。後は前と同様に実行ループやデリゲートの設定を行います。
データを送信する
サーバにデータを送信するには、NSOutputStreamオブジェクトを次のように使います。
-(void) writeToServer:(const uint8_t *) buf {
[oStream write:buf maxLength:strlen((char*)buf)];
}
このメソッドは、符号なし整数のバイト配列をサーバに書き込みます。
