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发送一些数据,而原始套接字会使它变得更加困难,而不是已经存在的库提供该功能。
答
我猜客户端正在使用一个大缓冲区(例如8kB),并且在该缓冲区满之前您不会收到任何消息。我不知道是否可以设置该缓冲区的大小,但这可能值得尝试。
只是好奇,为什么不只是让你的应用程序要求定时计时器的数据,而不是让你的PHP在无限循环中释放数据呢? – Jeremy
因为在3G连接时,我不希望它始终向服务器发送请求。我认为有一个开放的套接字和推送更新将是更优雅的解决方案,即使它在服务器端目前不是很优雅。 – arik
这似乎是关于[PHP'flush()'页面](http://us2.php.net/flush)的讨论主题。我必须承认,我尝试了一些没有太多运气的建议,但可能值得仔细看看它。 – Rob