NSStream处理事件给状态4

我试图在一个TCP连接的应用程序,我得到一个NSStreamEvent“4”handleEvent。 我究竟做错了什么?

我的代码就像,

-(void) initNetworkCommunication { CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 80, &readStream, &writeStream); inputStream = (__bridge_transfer NSInputStream *)readStream; outputStream = (__bridge_transfer NSOutputStream *)writeStream; [inputStream setDelegate:self]; [outputStream setDelegate:self]; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream open]; [outputStream open]; } - (IBAction)didTapButton:(id)sender { NSString *response = inputTextField.text; NSLog(@"%@", response); NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; [outputStream write:[data bytes] maxLength:[data length]]; } - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { switch (streamEvent) { case NSStreamEventOpenCompleted: NSLog(@"Stream opened"); break; case NSStreamEventHasBytesAvailable: NSLog(@"Stream has bytes available"); break; case NSStreamEventErrorOccurred: NSLog(@"Can not connect to the host!"); break; case NSStreamEventEndEncountered: NSLog(@"Stream closed"); break; default: NSLog(@"Unknown event: %@ : %d", theStream, streamEvent); } } 

控制台给,

 2012-05-29 13:37:07.132 GestureTrial[24289:f803] Stream opened 2012-05-29 13:37:07.133 GestureTrial[24289:f803] Stream opened 2012-05-29 13:37:07.133 GestureTrial[24289:f803] Unknown event: <__NSCFOutputStream: 0x6b85c70> : 4 

当试图发送消息到服务器。 我尝试了与Mactesting应用程序,它工作正常,所以可能不是一个防火墙问题。 设备和模拟器的输出相同。 任何帮助将非常感激。

其实你没有做错什么

这个事件(这是NSStreamEventHasSpaceAvailable )通常会在写入stream之后发生,告诉您stream已准备好再次写入,并且打开可写入stream之后。 请参阅NSStream类参考或确切地说: stream事件常量 。

如果你对<<运算符不熟悉,则意味着将位移到n位(每次移位等于乘以2)。 翻译将是:

 typedef enum { NSStreamEventNone = 0, NSStreamEventOpenCompleted = 1, NSStreamEventHasBytesAvailable = 2, NSStreamEventHasSpaceAvailable = 4, NSStreamEventErrorOccurred = 8, NSStreamEventEndEncountered = 16 }; 

在许多应用程序中,你会将这个事件简单地忽略(不处理),因为它在写入stream之后通常会很快发生。 如果出现问题,您将收到NSStreamEventErrorOccurredNSStreamEventEndEncountered ,这些是您需要处理的。 您可以使用NSStreamEventHasSpaceAvailable作为标志,可以发送更多的数据。

你也应该知道这两个stream(inputStream和outputStream)正在调用相同的委托方法。 这就是为什么你得到两个NSStreamEventOpenCompleted事件开始。 但在许多情况下,这不应该是一个问题。 如果需要的话,你可以随时检查哪个stream是事件的发起者。