【问题标题】:NSURLConnection non-closed streamNSURLConnection 非关闭流
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多