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
[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
相关文章推荐
- iOS网络编程实践–NSStream实现TCP Socket iPhone客户端
- 宋体、代码-iOS网络编程实践--NSStream实现TCP Socket iPhone客户端-by小雨
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS 网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS 网络编程实践--NSStream实现TCP Socket iPhone客户端 .
- iOS网络编程实践–NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS网络编程实践--NSStream实现TCP Socket iPhone客户端
- iOS NSStream TCP Socket iPhone 客户端实现效果
- Java网络编程实践和总结 --- 基于TCP的Socket编程之实现文件上传和下载服务
- linux网络编程--服务器客户端(TCP实现)
- IOS-18-网络通信之Socket通信中服务端与客户端的实现
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)