【发布时间】:2014-04-09 22:01:46
【问题描述】:
我有一个和这个类似的 PHP 服务器:
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 脚本设置为在一段时间后终止,并且连接关闭时,就会触发 data-received 方法。
因此我想知道:有没有办法在每次数据传输时得到通知?
尝试 #2
我的下一个尝试是使用 NSInputStreams。我是这样发起的:
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 发送一些数据,与已经提供的库相比,原始套接字会使它变得更加困难那个函数。
【问题讨论】:
-
只是好奇,为什么不让您的应用程序在预定的计时器上请求数据,而不是让您的 PHP 在无限循环中分发数据?
-
因为在 3G 连接时,我不希望它一直向服务器发送请求。我认为拥有一个开放的套接字并推送更新将是更优雅的解决方案,即使它目前在服务器端并不是很优雅。
-
这似乎是PHP
flush()page 上讨论的话题。我必须承认,我尝试了其中一些建议时运气不佳,但可能值得仔细研究一下。 -
@Rob:服务器端确实有效。我在不同的浏览器中对其进行了测试,它确实每 0.25 秒刷新一次。真正不起作用的是 iOS 客户端。
标签: php objective-c sockets nsurlconnection inputstream