2

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

你好,

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

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

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

感谢帮助。

4

4 回答 4

4

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

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

在此之前,我必须用 4k 左右来填充我的响应,以便回调命中。

于 2013-02-12T08:49:47.623 回答
2

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 中获得的行为相同。

于 2009-08-18T11:13:41.943 回答
2

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

感谢帮助。

于 2009-08-18T11:29:29.527 回答
0

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

于 2011-02-21T19:10:14.973 回答