0

所以我使用 Apple 的 PictureSharing/PictureSharingBrowser 示例来发送和接收数据。这使用服务器端的 NSFileHandle 使用 NSFileHandle 的 writeData 方法发送图片。

NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];

[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];

在我想发送大量数据(在本例中为 1MB 的数据)之前,这似乎工作正常。当我尝试这样做时,应用程序在执行 writeData 方法时挂起。客户端甚至没有开始读取数据,它只是打开了连接,但什么也没有发生。(它应该逐块读取数据,而服务器一次发送所有数据)。

我猜某处发生了一些僵局,但我不确定在哪里。我试图寻找异步。用 NSFileHandle 逐个写入数据的方法,但我找不到这样的方法。

任何指导都会有所帮助!

4

1 回答 1

0

我基本上错过了一步......在 NSNetServiceBrowser 的netServiceBrowser: didFindService:( moreComing: delegate 方法中,我不是简单地尝试连接到每个传入的服务,而是(正如文档所说:))保留服务,将委托设置为找到服务,并尝试解析服务。

然后,我可以在 *- (void)netServiceDidResolveAddress:(NSNetService )sender中打开已解析服务的流,这是 NSNetservice 的委托方法。

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    [aNetService retain];
    [aNetService setDelegate:self];
    [aNetService resolveWithTimeout:5.0];

}

- (void)netServiceDidResolveAddress:(NSNetService *)service{

    NSInputStream * istream;
    [sender getInputStream:&istream outputStream:nil];
    [istream retain];
    [istream setDelegate:self];
    [istream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [istream open];

    [service release];
}

//... NSStreamDelegate method to retrieve the data via the stream.
于 2010-07-01T17:19:20.330 回答