【问题标题】:HTTP connection with NSURLConnection in iphoneiphone中与NSURLConnection的HTTP连接
【发布时间】:2009-08-18 10:18:38
【问题描述】:

非常感谢您的回复。我被困在这里。你能帮忙解决这种情况吗? CFHTTPStream 能解决这个问题吗?有没有其他方法可以解决这个问题?谢谢。

嗨,

我正在使用 NSURLConnection 连接到一个 HTTP url。 我应该在一段时间后得到响应(响应没有从服务器关闭)。 是否可以在编写时读取那些响应,就像在 java 中的 http url 连接的输入流上有一个无限循环一样。 没有调用 didReceiveData 方法。

将其视为 http 推送,其中将根据其在服务器上的可用性写入响应。

我应该能够连接到服务器并保持连接,直到我不关闭连接。

感谢您的帮助。

【问题讨论】:

    标签: iphone http nsurlconnection


    【解决方案1】:

    我也在用这个撞墙,但我找到了解决方案:

    NSURLConnection 似乎确实缓冲了数据,但您可以通过在响应标头中设置内容类型来欺骗它。例如,通过将内容类型设置为"text/json",我可以在响应中只从服务器发送几个字节,而无需关闭流,并获取didReceiveData 回调方法给我数据。

    在此之前,我必须在响应中填充 4k 左右才能触发回调。

    【讨论】:

      【解决方案2】:

      感谢您的回复。 但我想澄清几件事......我可以看到从服务器写入的数据,但我的 didReceiveData 方法没有被调用。也不调用 connectionDidFinishLoading。委托设置正确。我想举个例子。我如何阅读此示例(url)发送的响应。[我的应用程序需要相同的功能。]http://www.servlets.com/jservlet2/examples/ch06/servlet/Countdown 它发送响应,例如 10、9、8、7、6 .....& 然后是图像。我们可以看到这是浏览器。 但是当我尝试通过代码连接并获得响应时,我只有在倒计时结束时才会得到响应,而且数据也非常大(我认为是图像数据)。我如何在发送之前阅读之前的小回复?

      感谢您的帮助。

      【讨论】:

        【解决方案3】:

        NSURLConnection 不会永远保持连接;它有一个超时,如果在该超时内没有收到数据,它会再次关闭连接。

        didReceiveData 仅在实际有可用数据时调用 - 如果您发送请求并且由于当前没有可用数据而没有从服务器返回任何内容,那么预计它不会被调用,不是吗?

        是否调用了connectionDidFinishLoading方法?如果调用它,我猜 NSURLConnection 正在等待数据一段时间,并且由于没有数据到达,它就停止了——因为一旦 NSURLConnection 完成,无论是否成功,都应该调用这个方法。

        NSURLConnection 基于 NSURLRequest,当创建 NSURLRequest 时,您可以手动设置超时。尝试设置一个非常大的超时。超时以秒为单位(秒的小数部分是允许的,它是一个浮点数),所以尝试将 28800.0 设置为超时,即 8 小时,看看连接现在是否保持打开的时间足够长以便调用 didReciveData。

        还请注意 NSURLConnection 不知道数据从哪里开始和数据在哪里结束,因此它可能会多次调用 didReceiveData 来发送一条数据,并且您的应用需要自己重新组装接收到的数据,它必须知道这是一个完整的数据块,准备好处理,还是必须等待更多数据进入另一个 didReceiveData 回调。

        更新

        NSURLConnection 不保证在数据到达后立即传递数据。如果它接收到一些数据,但仍有空间缓存更多数据,它将继续等待更多数据并将数据聚合成一个块,最后一次交付整个块。这就是为什么您的倒数计时器不起作用的原因。它确实提供了所有倒计时数据,但它在倒计时结束后才这样做,因为所有小的倒计时更新都完全适合单个块,并且 HTTP 标头的 MIME 类型进一步表明许多小块正在跟随。为了避免调用你的方法委托的次数过多,NSURLConnection 会在内部缓存回复内容,只要它还有空间这样做。

        我不确定你是否可以用 NSURLConnection 做你想做的事情。我个人更愿意为此使用真正的套接字连接 - 但我不知道这在 iPhone 上是否可行。

        如果对您有任何安慰,您在此处发布的 URL 在 Firefox 中运行良好,但在 Safari 4 中无法运行(Safari 4 仅在末尾显示图像,而不是倒计时)。因此,您在此处获得的行为与您在 Safari 中获得的行为相同。

        【讨论】:

        • 您好,非常感谢您的回复。我被困在这里。你能帮忙解决这种情况吗? CFHTTPStream 能解决这个问题吗?有没有其他方法可以解决这个问题?谢谢。
        • CFHTTP 似乎与 NS-Classes 相同,只是对于 Carbon(C 而不是 Obj-C),我怀疑它们的行为会有所不同。如果您必须在数据到达后立即访问数据,您需要打开一个原始套接字连接 (CFSocket) 并自己解析所有 HTTP 和 MIME 标头。您可以控制服务器端吗?例如。你能改变服务器发送数据的方式吗?还是您只能控制客户端?
        【解决方案4】:

        根据您的描述,sockets 将更适合您的需求。 不幸的是,我没有在 iphone 上进行任何套接字编程,所以我无法提供任何参考,但我确信 ios 有一些库可以提供帮助。

        【讨论】:

          猜你喜欢
          • 2013-05-07
          • 2015-11-19
          • 2016-09-10
          • 1970-01-01
          • 2012-11-25
          • 2013-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多