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网络编程初体验聊天程序实例开发的内容介绍完了,希望本文对你有所帮助!