与iphone中的NSURLConnection进行HTTP连接

时间:2009-08-18 10:18:39

标签: iphone http nsurlconnection

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

您好,

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

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

我应该可以连接到服务器&保持连接,直到我没有关闭连接。

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

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

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

在此之前,我必须以4k左右的时间填充我的回复才能回击。

答案 1 :(得分:2)

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

didReceiveData仅在实际可用数据时被调用 - 如果您发送请求并且没有任何内容从服务器返回,因为当前没有可用的数据,则预计它不会被调用,不是吗? / p>

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

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

另请注意,NSURLConnection不知道数据的开始位置和数据结束的位置,因此它可能会多次调用didReceiveData以发送一个数据,并且您的应用需要重新组合接收的数据本身,并且必须知道这是一个完整的数据块,是否可以处理,或者是否必须等待另一个didReceiveData回调中的更多数据。

更新

NSURLConnection不保证在数据到达时立即传送数据。如果它接收到一些数据并且仍有空间来缓存更多数据,它将继续等待更多数据并将数据聚合到一个块中,最后立即交付整个块。这就是你的倒数计时器不起作用的原因。它确实提供所有倒计时数据,但它在倒计时结束后这样做,因为所有小倒计时更新完全适合单个块,并且HTTP头的MIME类型进一步宣布许多小块正在跟随。为避免更频繁地调用您的方法委托,NSURLConnection会在内部缓存回复内容,只要它仍有空间可以执行此操作。

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

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

答案 2 :(得分:2)

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

感谢您的帮助。

答案 3 :(得分:0)

根据您的描述,sockets会更符合您的需求。 不幸的是我没有在iphone上做任何套接字编程,所以我不能提供任何参考,但我相信ios有一些库可以帮助。