iPhone網(wǎng)絡(luò)編程初體驗聊天程序?qū)嵗_發(fā)
iPhone網(wǎng)絡(luò)編程初體驗聊天程序實例開發(fā)是本文要介紹的內(nèi)容,講解了如何實現(xiàn)聊天程序的案例,不多說,先來看內(nèi)容。首先使用Xcode常見一個基于視圖(View)的應(yīng)用程序項目,取名Network。
使用網(wǎng)絡(luò)通信流
使用套接字在網(wǎng)絡(luò)上通信最簡單的方法是使用NSStream類,NSStream類是一個表示流的抽象類,你可以使用它讀寫數(shù)據(jù),它可以用在內(nèi)存、文件或網(wǎng)絡(luò)上。使用NSStream類,你可以向服務(wù)器寫數(shù)據(jù),也可以從服務(wù)器讀取數(shù)據(jù)。
在Mac OS X上,可以使用NSHost和NSStream對象建立到服務(wù)器的連接,如:
- 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:,它創(chuàng)建一個到服務(wù)器的輸入和輸出流,但問題是iPhone OS不支持getStreamsToHost:port:inputStream:outputStream:方法,因此上面的代碼在iPhone應(yīng)用程序中是不能運行的。
為了解決這個問題,你可以增加一個類別到現(xiàn)有的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:方法,現(xiàn)在你可以在你的iPhone應(yīng)用程序中使用這個方法,使用TCP協(xié)議連接到服務(wù)器。
在NetworkViewController.m文件中,插入下面的代碼:
- #import "NetworkViewController.h"
- #import "NSStreamAdditions.h"
- @implementation NetworkViewController
- NSMutableData *data;
- NSInputStream *iStream;
- NSOutputStream *oStream;
定義 connectToServerUsingStream:portNo:方法,以便連接到服務(wù)器,然后創(chuàng)建輸入和輸出流對象:
- -(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];
- }
- }
- }
在一個運 行循環(huán)中,你可以調(diào)度輸入和輸出流接收事件,這樣可以避免阻塞。
小結(jié):iPhone網(wǎng)絡(luò)編程初體驗聊天程序實例開發(fā)的內(nèi)容介紹完了,希望本文對你有所幫助!