iPhone网络编程初体验聊天程序实例开发

移动开发 iOS
本文介绍的是iPhone网络编程初体验聊天程序实例开发,主要是实现聊天程序的一个实例,先来看详细内容。

iPhone网络编程初体验聊天程序实例开发是本文要介绍的内容,讲解了如何实现聊天程序的案例,不多说,先来看内容。首先使用Xcode常见一个基于视图(View)的应用程序项目,取名Network。

使用网络通信流

使用套接字在网络上通信最简单的方法是使用NSStream类,NSStream类是一个表示流的抽象类,你可以使用它读写数据,它可以用在内存、文件或网络上。使用NSStream类,你可以向服务器写数据,也可以从服务器读取数据。

在Mac OS X上,可以使用NSHost和NSStream对象建立到服务器的连接,如:

  1. NSInputStream *iStream;  
  2.             NSOutputStream *oStream;  
  3.             uint portNo = 500;  
  4.             NSURL *website = [NSURL URLWithString:urlStr];  
  5.             NSHost *host = [NSHost hostWithName:[website host]];  
  6.             [NSStream getStreamsToHost:host  
  7.                                   port:portNo  
  8.                            inputStream:&iStream  
  9.                           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文件中,增加下面的代码:

  1. #import  
  2. @interface NSStream (MyAdditions)  
  3. + (void)getStreamsToHostNamed:(NSString *)hostName  
  4.                          port:(NSInteger)port  
  5.                   inputStream:(NSInputStream **)inputStreamPtr  
  6.                  outputStream:(NSOutputStream **)outputStreamPtr;  
  7. @end 

在NSStreamAdditions文件中加入以下代码:

  1. #import "NSStreamAdditions.h"  
  2. @implementation NSStream (MyAdditions)  
  3. + (void)getStreamsToHostNamed:(NSString *)hostName  
  4.                           port:(NSInteger)port  
  5.                    inputStream:(NSInputStream **)inputStreamPtr  
  6.                   outputStream:(NSOutputStream **)outputStreamPtr  
  7.  {  
  8.      CFReadStreamRef     readStream;  
  9.      CFWriteStreamRef    writeStream;  
  10.      assert(hostName != nil);  
  11.      assert( (port > 0) && (port < 65536) );  
  12.      assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );  
  13.      readStream = NULL;  
  14.      writeStream = NULL;  
  15.      CFStreamCreatePairWithSocketToHost(  
  16.                                         NULL,  
  17.                                         (CFStringRef) hostName,  
  18.                                         port,  
  19.                                         ((inputStreamPtr  != nil) ? &readStream : NULL),  
  20.                                         ((outputStreamPtr != nil) ? &writeStream : NULL)  
  21.                                         );  
  22.          if (inputStreamPtr != NULL) {  
  23.         *inputStreamPtr  = [NSMakeCollectable(readStream) autorelease];  
  24.      }  
  25.      if (outputStreamPtr != NULL) {  
  26.          *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];  
  27.      }  
  28.  }  
  29.  @end 

上面的代码为NSStream类增加了一个 getStreamsToHostNamed:port:inputStream:outputStream:方法,现在你可以在你的iPhone应用程序中使用这个方法,使用TCP协议连接到服务器。

在NetworkViewController.m文件中,插入下面的代码:

  1. #import "NetworkViewController.h"  
  2. #import "NSStreamAdditions.h"  
  3. @implementation NetworkViewController  
  4. NSMutableData *data;  
  5. NSInputStream *iStream;  
  6. NSOutputStream *oStream; 

定义 connectToServerUsingStream:portNo:方法,以便连接到服务器,然后创建输入和输出流对象:

  1. -(void) connectToServerUsingStream:(NSString *)urlStr  
  2.                             portNo: (uint) portNo {  
  3.     if (![urlStr isEqualToString:@""]) {  
  4.         NSURL *website = [NSURL URLWithString:urlStr];  
  5.         if (!website) {  
  6.             NSLog(@"%@ is not a valid URL");  
  7.             return;  
  8.         } else {  
  9.             [NSStream getStreamsToHostNamed:urlStr  
  10.                                        port:portNo  
  11.                                 inputStream:&iStream  
  12.                                outputStream:&oStream];              
  13.             [iStream retain];  
  14.             [oStream retain];  
  15.             [iStream setDelegate:self];  
  16.             [oStream setDelegate:self];  
  17.               
  18.             [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]   forMode:NSDefaultRunLoopMode];  
  19.             [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]   forMode:NSDefaultRunLoopMode];  
  20.             [oStream open];  
  21.             [iStream open];              
  22.         }  
  23. }      

在一个运 行循环中,你可以调度输入和输出流接收事件,这样可以避免阻塞。

小结:iPhone网络编程初体验聊天程序实例开发的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei
相关推荐

2011-06-07 17:35:39

iphone 多线程

2016-09-27 16:38:24

JavaScript微信Web

2021-08-12 14:33:20

Python多线程编程

2011-06-20 13:23:03

Qt Quick QML

2020-12-01 15:37:07

Python

2010-08-01 16:11:53

Android

2011-07-26 11:13:15

iPhone PXL

2010-05-23 10:29:29

Widget开发

2012-05-16 10:50:17

Windows Pho

2009-08-01 09:06:35

UbuntuOneLinux开源操作系统

2009-03-09 15:12:39

XenServer安装

2018-03-22 15:36:26

程序员RubyiOS

2011-07-25 18:02:51

iPhone LibFetion 移植

2011-07-18 15:32:14

iPhone 录音 播放

2009-06-23 10:06:03

2011-08-08 16:56:44

iPhone 字符处理 视图

2011-05-30 15:12:10

App Invento 初体验

2010-11-22 10:31:17

Sencha touc

2023-07-15 08:01:38

2017-10-31 08:19:04

iPhone
点赞
收藏

51CTO技术栈公众号