もっと面白い例
以前、DevX.comに投稿した記事の中で、.NETによる独自のインスタントメッセンジャーアプリケーションの作り方を説明しました(「Home-brew Your Own Instant Messenger App with Visual Studio .NET」を参照)。その記事で紹介したのは、複数のユーザーの間でチャットメッセージを交換できるクライアント/サーバアプリケーションでした。そのコードを利用し、本稿のiPhoneアプリをチャットクライアントとして動作するように修正すれば、他のプラットフォームのユーザーと通信することも可能です。
前に作成した同じプロジェクトを使用し、以下のビューをViewウィンドウに追加します(図3を参照)。
- Label
- Text Field
- Round Rect Button
- Text View
Text Viewを選択し、[Command]キーを押しながら[T]キーを押し、フォントサイズを9ポイントに変更します(図4を参照)。
NetworkViewController.hファイルに、以下のステートメントを追加します。
#import @interface NetworkViewController : UIViewController { IBOutlet UITextField *txtMessage; IBOutlet UITextField *txtNickName; IBOutlet UITextView *txtMessages; } @property (nonatomic, retain) UITextField *txtMessage; @property (nonatomic, retain) UITextField *txtNickName; @property (nonatomic, retain) UITextView *txtMessages; -(IBAction) btnSend:(id) sender; -(IBAction) btnLogin:(id) sender; @end
以下の操作を行います。
- [Control]キーを押しながら[File's Owner]アイテムをクリックし、1番上のText Fieldビューまでドラッグ&ドロップする。[txtNickName]を選択する
- [Control]キーを押しながら[File's Owner]アイテムをクリックし、1番上のText Viewビューまでドラッグ&ドロップする。[txtMessages]を選択する
- [Control]キーを押しながらRound Rect Buttonビューをクリックし、[File's Owner]アイテムまでドラッグ&ドロップする。[btnLogin:]を選択する
[File's Owner]アイテムを右クリックして、その接続を確認します(図5を参照)。
NetworkViewController.mファイルに、リスト4のステートメントを追加します。
#import "NetworkViewController.h" #import "NSStreamAdditions.h" #import <CFNetwork/CFNetwork.h> @implementation NetworkViewController @synthesize txtMessage; @synthesize txtNickName; @synthesize txtMessages; -(IBAction) btnLogin:(id) sender { const uint8_t *str = (uint8_t *) [txtNickName.text cStringUsingEncoding:NSASCIIStringEncoding]; [self writeToServer:str]; } - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { switch(eventCode) { case NSStreamEventHasBytesAvailable: { if (data == nil) { data = [[NSMutableData alloc] init]; } uint8_t buf[1024]; unsigned int len = 0; len = [(NSInputStream *)stream read:buf maxLength:1024]; if(len) { [data appendBytes:(const void *)buf length:len]; int bytesRead; bytesRead += len; } else { NSLog(@"No data."); } NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(str); NSString *existingMsg = txtMessages.text; existingMsg = [existingMsg stringByAppendingString:str]; txtMessages.text = existingMsg; [str release]; [data release]; data = nil; } break; } } - (void)dealloc { [txtNickName release]; [txtMessages release]; [txtMessage release]; [self disconnect]; [iStream release]; [oStream release]; if (readStream) CFRelease(readStream); if (writeStream) CFRelease(writeStream); [super dealloc]; }
さて、これですべての準備ができました。[Command]キーを押しながら[R]キーを押してアプリをテストしてください。まず自分のニックネームを入力し、[Login]ボタンをタップします(図6を参照)。メッセージを入力し、[Send]ボタンをタップすればチャットを開始できます。
原文では「参考までに、C#で書いたチャットサーバを本稿のダウンロードパッケージとして用意したのでご利用ください」という旨の注記が記載されていましたが、ダウンロード用リンクが示されていないため、パッケージはダウンロードができないようです(2010/02/17時点)。
まとめ
本稿では、TCP/IPを使用して他のサーバと通信する方法を説明しました。外の世界と通信する方法を会得すると非常に面白いアプリを作ることができます。次回は、iPhoneにおけるBluetoothプログラミングについてお話しします。