2009-07-13 86 views
14

我正在研究一个iPhone应用程序,它将使用长轮询从服务器向客户端发送HTTP事件通知。在服务器上打开一个连接后,我发送一小部分代表事件的JSON,当它们发生时。我发现-[NSURLConnectionDelegate connection:didReceiveData]直到关闭连接后才会被调用,无论创建NSURLRequest时使用的缓存设置如何。我已验证服务器端正在按预期工作 - 第一个JSON事件将立即发送,随后的事件将在发生时通过线路发送。有没有办法使用NSURLConnection在事件发生时接收这些事件,或者我是否需要下载到CFSocket API?使用NSURLConnection的长轮询

我开始着手整合CocoaAsyncSocket,但如果可能的话,宁愿继续使用NSURLConnection,因为它适合其余的基于REST/JSON的Web服务结构。

+0

嘿,我看到你用asyncsocket来获得所需的结果。有什么机会我可以在这个时候挑选你的大脑?我是twitter上的@suprfrends。这将不胜感激! – 2011-04-07 04:57:43

+0

我能算出这个....退房: http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus 2013-02-12 08:53:17

+0

我找到了它的解决方案,我看到这里的答复: http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus 2013-02-12 08:54:55

回答

7

NSURLConnection将在下载时缓冲数据,并使用didReceiveData方法将这些数据全部回传给您。 NSURLConnection类无法分辨网络延迟和数据中的故意拆分之间的差异。您可能需要像CFSocket一样使用较低级别的网络API(您可以从网络接口访问每个字节,并且可以区分有效负载的两部分),或者你可以看看像CURL这样的库,看看那里有什么类型的输出缓冲/非缓冲。

0

听起来好像你需要刷新服务器端的套接字,虽然确实很难说。如果你不能轻易地改变服务器来做到这一点,那么它可能有助于嗅探网络连接,以查看从服务器实际发送的东西的时间。

您可以使用像Wireshark这样的工具来嗅探您的网络。

的看到的是越来越送到另一个选项/接收/从下面的文章中介绍的电话:

http://blog.jerodsanto.net/2009/06/sniff-your-iphones-network-traffic/

祝你好运!

+0

我可以通过telnet连接一并且如预期的那样验证数据是递增递减的。这听起来像NSURLConnection总是缓冲数据,如马特提到的。 – pix0r 2009-07-13 17:00:13

0

我们目前正在做一些R & D来将我们的StreamLink慧星库移植到iPhone。

我发现在模拟器中,一旦收到1KB数据,您将开始获取didReceiveData回调。所以你可以发送一个垃圾1KB块开始获取回调。但是,似乎在设备上,这不会发生。在safari(在设备上)你需要发送2KB,但使用NSURLConnection我也没有回调。看起来我可能不得不采取相同的方法。

我可能还会玩multipart-replace和一些其他更新颖的头文件和MIME类型来查看它是否有助于刺激NSURLConnection。

0

还有一种名为ASIHttpRequest HTTP API实现。它没有上述问题,并为几乎所有HTTP功能提供了完整的工具包,包括文件上传,Cookie,身份验证......

http://allseeing-i.com/ASIHTTPRequest/