iPhone網絡編程初體驗聊天程序實例開發
iPhone網絡編程初體驗聊天程序實例開發是本文要介紹的內容,講解了如何實現聊天程序的案例,不多說,先來看內容。首先使用Xcode常見一個基于視圖(View)的應用程序項目,取名Network。
使用網絡通信流
使用套接字在網絡上通信最簡單的方法是使用NSStream類,NSStream類是一個表示流的抽象類,你可以使用它讀寫數據,它可以用在內存、文件或網絡上。使用NSStream類,你可以向服務器寫數據,也可以從服務器讀取數據。
在Mac OS X上,可以使用NSHost和NSStream對象建立到服務器的連接,如:
- NSInputStream *iStream;
- NSOutputStream *oStream;
- uint portNo = 500;
- NSURL *website = [NSURL URLWithString:urlStr];
- NSHost *host = [NSHost hostWithName:[website host]];
- [NSStream getStreamsToHost:host
- port:portNo
- inputStream:&iStream
- outputStream:&oStream];
NSStream類有一個方法getStreamsToHost:port:inputStream:outputStream:,它創建一個到服務器的輸入和輸出流,但問題是iPhone OS不支持getStreamsToHost:port:inputStream:outputStream:方法,因此上面的代碼在iPhone應用程序中是不能運行的。
為了解決這個問題,你可以增加一個類別到現有的NSStream類上,替換 getStreamsToHost:port:inputStream:outputStream:方法提供的功能。在Xcode的Classes上點擊右鍵,添加一個文件NSStreamAdditions.m,在NSStreamAdditions.h文件中,增加下面的代碼:
- #import
- @interface NSStream (MyAdditions)
- + (void)getStreamsToHostNamed:(NSString *)hostName
- port:(NSInteger)port
- inputStream:(NSInputStream **)inputStreamPtr
- outputStream:(NSOutputStream **)outputStreamPtr;
- @end
在NSStreamAdditions文件中加入以下代碼:
- #import "NSStreamAdditions.h"
- @implementation NSStream (MyAdditions)
- + (void)getStreamsToHostNamed:(NSString *)hostName
- port:(NSInteger)port
- inputStream:(NSInputStream **)inputStreamPtr
- outputStream:(NSOutputStream **)outputStreamPtr
- {
- CFReadStreamRef readStream;
- CFWriteStreamRef writeStream;
- assert(hostName != nil);
- assert( (port > 0) && (port < 65536) );
- assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );
- readStream = NULL;
- writeStream = NULL;
- CFStreamCreatePairWithSocketToHost(
- NULL,
- (CFStringRef) hostName,
- port,
- ((inputStreamPtr != nil) ? &readStream : NULL),
- ((outputStreamPtr != nil) ? &writeStream : NULL)
- );
- if (inputStreamPtr != NULL) {
- *inputStreamPtr = [NSMakeCollectable(readStream) autorelease];
- }
- if (outputStreamPtr != NULL) {
- *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];
- }
- }
- @end
上面的代碼為NSStream類增加了一個 getStreamsToHostNamed:port:inputStream:outputStream:方法,現在你可以在你的iPhone應用程序中使用這個方法,使用TCP協議連接到服務器。
在NetworkViewController.m文件中,插入下面的代碼:
- #import "NetworkViewController.h"
- #import "NSStreamAdditions.h"
- @implementation NetworkViewController
- NSMutableData *data;
- NSInputStream *iStream;
- NSOutputStream *oStream;
定義 connectToServerUsingStream:portNo:方法,以便連接到服務器,然后創建輸入和輸出流對象:
- -(void) connectToServerUsingStream:(NSString *)urlStr
- portNo: (uint) portNo {
- if (![urlStr isEqualToString:@""]) {
- NSURL *website = [NSURL URLWithString:urlStr];
- if (!website) {
- NSLog(@"%@ is not a valid URL");
- return;
- } else {
- [NSStream getStreamsToHostNamed:urlStr
- port:portNo
- inputStream:&iStream
- outputStream:&oStream];
- [iStream retain];
- [oStream retain];
- [iStream setDelegate:self];
- [oStream setDelegate:self];
- [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- [oStream open];
- [iStream open];
- }
- }
- }
在一個運 行循環中,你可以調度輸入和輸出流接收事件,這樣可以避免阻塞。
小結:iPhone網絡編程初體驗聊天程序實例開發的內容介紹完了,希望本文對你有所幫助!