通常情况下,特别是与sockets相关联时,streams会遇到错误从而不能进一步处理stream data。一般情况下,错误提示了在流的一端缺失了东西,比如说远程主机的crash,正在使用的文件被删除等等。在此情况下,客户端能够做的就是将这些错误提示给用户,尽管一个stream object在上报错误之后,在它关闭之前仍然可以查询它的状态,但是它不能再用于写或者读操作。
当错误发生时,NSStream和NSOutputStream类通过以下几种方式发起通知:
1,如果stream object布置在一个run loop上,那么该对象通过stream:handleEvent:消息向其delegate发送NSStreamEventErrorOccurred事件发起通知
2,任何时候客户端可以向stream object发送streamStatus消息查询是否会返回NSStreamStatusError
3,如果你尝试通过write:maxLength:消息向NSOutputStream对象写数据时,该消息返回值 -1,这时发生一个写错误
一旦你检查到stream object发生错误,你可以向stream object发送streamError消息获得更加详细的信息(是一个NSError对象),然后将该错误信息通知给用户。下面的代码是布置在一个run loop上的stream object的delegate处理错误的方法:
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
NSLog(@"stream:handleEvent: is invoked...");
switch(eventCode) {
case NSStreamEventErrorOccurred:
{
NSError *theError = [stream streamError];
NSAlert *theAlert = [[NSAlert alloc] init]; // modal delegate releases
[theAlert setMessageText:@"Error reading stream!"];
[theAlert setInformativeText:[NSString stringWithFormat:@"Error %i: %@",
[theError code], [theError localizedDescription]]];
[theAlert addButtonWithTitle:@"OK"];
[theAlert beginSheetModalForWindow:[NSApp mainWindow]
modalDelegate:self
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
contextInfo:nil];
[stream close];
[stream release];
break;
}
// continued ....
}
}
对于某些错误,除了通知用户之后你可以做更多的工作。比如,如果你在进行socket连接的时候设置了SSL 安全等级,但是远程的主机没有设定,该stream object会发送一个错误,你可以释放之前的stream object并且创建一个新的不安全的套接字连接。