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。如果出现问题,您可以获得NSStreamEventErrorOccurred
或NSStreamEventEndEncountered
,这些是您需要处理的。您可以使用NSStreamEventHasSpaceAvailable
作为它的标志。发送更多的数据。
您还应该知道,两个流(inputStream和outputStream)都调用相同的委托方法。这就是为什么你要开始两个NSStreamEventOpenCompleted
事件。但是在很多情况下,这不应该是一个问题。如果需要,您可以始终检查哪个流是事件的发起者。
非常感谢!我对移位操作符感到困惑,服务器也没有响应。所以我认为状态4是一些错误。现在我已经忽略了状态4。一旦服务器端得到修复,我就可以从服务器获取消息。再次感谢您的澄清。 –
不客气! –