美好的一天,
我正在iPhone上为PC上运行的应用程序编写自定义控制器。我正在使用标准编码来设置&打开插座&在我的ios客户端上写/接收数据。一切顺利,直到我去了一个无线连接弱的区域,其中iPhone或PC失去了连接。我使用Reachability
在iPhone上为wifi连接添加了测试,该测试按预期工作。我假设使用与NSStream
相关联的三种可能的错误检查方法之一会让我知道连接的远程端(即PC)是否有问题。
我开始发送[outputStream streamStatus]
消息,希望在我关闭PC上的wifi适配器时获得NSStreamStatusError
代码。我得到的是一个NSStreamStatusOpen
代码。
第二次尝试是检查来自write: maxLength:
的-1返回码。相反,这给出了成功发送的字节数(据说)。
第三次尝试是明确查看NSStream
委托接收的代码。大部分时间都是NSStreamEventHasSpaceAvailable
,但绝不是NSStreamEventErrorOccurred
。
有谁知道为什么? NSStream
与Reachability
(旧版本)相似吗?只要手机有连接就很开心吗?
感谢您的任何见解。
RB
答案 0 :(得分:2)
有时,特别是对于套接字,流可能会遇到阻止进一步处理流数据的错误。通常,错误表示在流的一端没有某些东西,例如远程主机的崩溃或正在流式传输的文件的删除。除了向用户报告错误之外,当发生大多数错误时,流的客户端可以执行一些操作。虽然报告错误的流对象可以在关闭之前查询状态,但不能重复用于读取或写入操作。
NSStream
和NSOutputStream
类会以多种方式通知您是否发生错误:
1.如果在运行循环中调度流对象,则对象会在NSStreamEventErrorOccurred
中向其委托报告stream:handleEvent: message
事件。
2.任何时候,客户端都可以向流对象发送streamStatus
消息,看它是否返回NSStreamStatusError
。
3.如果您尝试通过发送NSOutputStream
来写入write:maxLength:
对象并返回-1,则表示发生了写入错误。
确定流对象遇到错误后,可以使用streamError消息查询对象以获取有关错误的更多信息(以NSError对象的形式)。接下来,告知用户有关错误的信息。清单1显示了运行循环调度的流对象的委托如何处理错误。
- (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];
[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 ....
}
}