您的位置:首页 > 理论基础 > 计算机网络

iOS网络编程实践--NSStream实现TCP Socket iPhone客户端

2014-01-06 11:41 791 查看

 
[self initNetworkCommunication]; 
 

它们都调用initNetworkCommunication方法,并设置操作标识flag,如果flag为0发送数据,flag为1接收数据。
流的状态的变化触发很多事件,并回调NSStreamDelegate协议中定义的方法stream:handleEvent:,其代码如下:

 

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 
 
NSString *event; 
 
switch (streamEvent) { 
 
case NSStreamEventNone: 
 
event = @”NSStreamEventNone”; 
 
break; 
 
case NSStreamEventOpenCompleted: 
 
event = @”NSStreamEventOpenCompleted”; 
 
break; 
 
case NSStreamEventHasBytesAvailable: 
 
event = @”NSStreamEventHasBytesAvailable”; 
 
if (flag ==1 && theStream == _inputStream) { 
 
NSMutableData *input = [[NSMutableData alloc] init]; 
 
uint8_t buffer[1024];  ① 
 
int len; 
 
while([_inputStream hasBytesAvailable]) ② 
 

 
len = [_inputStream read:buffer maxLength:sizeof(buffer)];  ③ 
 
if (len > 0) 
 

 
[input appendBytes:buffer length:len]; 
 

 

 
NSString *resultstring = [[NSString alloc] 
 
initWithData:input encoding:NSUTF8StringEncoding]; 
 
NSLog(@”接收:%@”,resultstring); 
 
_message.text = resultstring; 
 

 
break; 
 
case NSStreamEventHasSpaceAvailable: 
 
event = @”NSStreamEventHasSpaceAvailable”; 
 
if (flag ==0 && theStream == _outputStream) { 
 
//输出 
 
UInt8 buff[] = ”Hello Server!”; ④ 
 
[_outputStream write:buff maxLength: strlen((const char*)buff)+1]; ⑤ 
 
//关闭输出流 
 
[_outputStream close]; 
 

 
break; 
 
case NSStreamEventErrorOccurred: 
 
event = @”NSStreamEventErrorOccurred”; 
 
[self close]; ⑥ 
 
break; 
 
case NSStreamEventEndEncountered: 
 
event = @”NSStreamEventEndEncountered”; 
 
NSLog(@”Error:%d:%@”,[[theStream streamError] code], 
 
[[theStream streamError] localizedDescription]); 
 
break; 
 
default: 
 
[self close];  ⑦ 
 
event = @”Unknown”; 
 
break; 
 

 
NSLog(@”event——%@”,event); 
 


在读取数据分支(NSStreamEventHasBytesAvailable)中,代码第①行为读取数据准备缓冲区,本例中设置的是1024个字节,这个大小会对流的读取有很多的影响。第②行代码使用hasBytesAvailable方法判断是否流有数据可以读,如果有可读数据就进行循环读取。第③行代码使用流的read:maxLength:方法读取数据到缓冲区,第1个参数是缓冲区对象buffer,第2个参数是读取的缓冲区的字节长度。

在写入数据分支(NSStreamEventHasSpaceAvailable)中,代码第④行是要写入的数据,第⑤行代码 [_outputStream write:buff maxLength: strlen((const char*)buff)+1]是写如数据方 法。

第⑥和第⑦行代码[self close]调用close方法关闭,close方法代码如下:

 

-(void)close 
 

 
[_outputStream close]; 
 
[_outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] 
 
forMode:NSDefaultRunLoopMode]; 
 
[_outputStream setDelegate:nil]; 
 
[_inputStream close]; 
 
[_inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] 
 
forMode:NSDefaultRunLoopMode]; 
 
[_inputStream setDelegate:nil]; 
 


本文出自 “关东升-iOS技术顾问” 博客,请务必保留此出处http://2009315319.blog.51cto.com/701759/1178407
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: