NSStream处理事件给予状态4

问题描述:

我正在尝试一个TCP连接应用程序,并且我正在handleEvent上获得一个NSStreamEvent“4”。我究竟做错了什么?NSStream处理事件给予状态4

我的代码是什么样子,

-(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 

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

其实你没有做错什么。

此事件(它是NSStreamEventHasSpaceAvailable)在写入流后通常会发生,告诉您该流已准备好再次写入,并且在打开可写入流之后。请参阅NSStream Class Reference或确切地说:Stream Event Constants

如果您不熟悉<<运算符,则表示将位移位到n位(每次移位等于乘以2)。翻译为:

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

在许多应用中,你会本身这个事件根本忽略(不处理),因为它通常写入流后很快occours。如果出现问题,您可以获得NSStreamEventErrorOccurredNSStreamEventEndEncountered,这些是您需要处理的。您可以使用NSStreamEventHasSpaceAvailable作为它的标志。发送更多的数据。

您还应该知道,两个流(inputStream和outputStream)都调用相同的委托方法。这就是为什么你要开始两个NSStreamEventOpenCompleted事件。但是在很多情况下,这不应该是一个问题。如果需要,您可以始终检查哪个流是事件的发起者。

+1

非常感谢!我对移位操作符感到困惑,服务器也没有响应。所以我认为状态4是一些错误。现在我已经忽略了状态4。一旦服务器端得到修复,我就可以从服务器获取消息。再次感谢您的澄清。 –

+0

不客气! –