我在 iPhone 上实现了 FTP 客户端,但是当从 FTP 服务器下载时连接暂时中断时,应用程序会通知我没有连接并停止客户端。
问题来了:下次我尝试再次启动下载过程时,事件 stream:handleEvent:
不会被触发,并且 的
保持在 streamStatus
networkStreamNSStreamStatusOpening
上。
如果我手动停止下载过程(使用与连接中断时触发的相同方法),我可以再次重新下载。我必须重新启动整个应用程序才能再次下载。
以下是代码的关键部分:
- (void)downloadFile:(NSDictionary *)file {
NSURL *url;
CFReadStreamRef ftpStream;
url = [NSURL URLWithString:[@"PATH TO FTP FILE" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[self.fileStream open];
ftpStream = CFReadStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url);
self.networkStream = (__bridge NSInputStream *) ftpStream;
self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.networkStream open];
CFRelease(ftpStream);
}
以及流发生某些情况时触发的方法
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventOpenCompleted: {
[self updateStatus:@"Opened connection"];
} break;
case NSStreamEventHasBytesAvailable: {
NSInteger bytesRead;
uint8_t buffer[32768];
bytesRead = [self.networkStream read:buffer maxLength:sizeof(buffer)];
if (bytesRead == -1) {
[self stopReceivingWithStatus:@"Network read error"];
} else if (bytesRead == 0) {
[self stopReceivingWithStatus:nil];
} else {
[self processStreamDataWithBuffer:buffer andReadBytes:bytesRead];
}
} break;
case NSStreamEventHasSpaceAvailable: {
assert(NO);
} break;
case NSStreamEventErrorOccurred: {
[self stopReceivingWithStatus:@"Stream open error"];
} break;
case NSStreamEventEndEncountered: {
} break;
default: {
assert(NO);
} break;
}
正如我所说,问题是连接中断后,事件不再触发。
注意:我使用带有 ARC 的 iOS 5。
最佳答案
也许您应该设置标志来强制流关闭底层 native 套接字,默认情况下不会完成;
[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];
关于iphone - 如何使用 CFNetwork 处理 iOS 上的互联网连接中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903172/