通常情况下,特别是与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并且创建一个新的不安全的套接字连接。