NSURLConnection的非闭合流

问题描述:

我有一个类似于这样一个PHP服务器:NSURLConnection的非闭合流

header('Content-Type: text/plain; charset=utf-8'); 
header('Content-Encoding: none;'); //disable apache compressed 

ob_end_flush(); 
ob_start(); 
set_time_limit(0); 
error_reporting(0); 

while(true){ 

    echo ++$i.PHP_EOL; 

    ob_flush(); 
    flush(); 

    usleep(250 * 1000); 

} 

此服务器永远不会关闭的连接,并刷新一个增量数字每季度第二。在浏览器中打开此页面时,它可以正常工作,并且内容在页面仍在加载时增长。此页面通过HTTP提供。

未遂#1,强烈的首选去上班

我也有一类就是一个NSURLConnection的设置为0(它不应该有一个超时的话)的超时。该班使用NSURLConnectionDelegate协议收集数据;每当服务器发送数据时,功能- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data被触发。这在连接关闭后非常有效;如果要发送大量数据,则可以非常准确地跟踪进度。

但是,在我的情况下,连接没有关闭,它永远不会。不过,我想通知每次冲洗。目前,没有任何方法触发。当我设置PHP脚本在一段时间后终止,并且连接关闭时,数据接收方法被触发。

因此我想知道:有没有办法通知每一个数据传输?使用NSInputStreams

未遂#2

我的下一个尝试是。我开始他们这样的:

self.iStream = [[NSInputStream alloc] initWithURL:[NSURL URLWithString:@"http://localhost/secuchat/lab/socket_test.php"]]; 
[self.iStream setDelegate:self]; 
[self.iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[self.iStream open]; 

然而唉,这里也一样,功能- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode永远不会被解雇。

最后,我真的希望以某种方式让它使用第一种方法工作,因为我希望能够使用POST发送一些数据,而原始套接字会使它变得更加困难,而不是已经存在的库提供该功能。

+0

只是好奇,为什么不只是让你的应用程序要求定时计时器的数据,而不是让你的PHP在无限循环中释放数据呢? – Jeremy

+0

因为在3G连接时,我不希望它始终向服务器发送请求。我认为有一个开放的套接字和推送更新将是更优雅的解决方案,即使它在服务器端目前不是很优雅。 – arik

+0

这似乎是关于[PHP'flush()'页面](http://us2.php.net/flush)的讨论主题。我必须承认,我尝试了一些没有太多运气的建议,但可能值得仔细看看它。 – Rob

我猜客户端正在使用一个大缓冲区(例如8kB),并且在该缓冲区满之前您不会收到任何消息。我不知道是否可以设置该缓冲区的大小,但这可能值得尝试。