使用NSURLConnection进行长轮询

时间:2009-07-13 16:34:17

标签: iphone objective-c comet

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

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

5 个答案:

答案 0 :(得分:7)

NSURLConnection将在下载数据时缓冲数据,并使用didReceiveData方法将数据全部返回给您。 NSURLConnection类无法区分网络延迟和数据中的故意拆分。

您需要使用像CFSocket这样的低级网络API(您可以访问网络接口中的每个字节,并且可以区分有效负载的两个部分),或者您可以看看像CURL这样的库,看看那里有什么类型的输出缓冲/非缓冲。

答案 1 :(得分:3)

我今天遇到了这个。我编写了自己的类来处理这个问题,它模仿了NSURLConnection的基本功能。

http://github.com/nall/SZUtilities/blob/master/SZURLConnection.h

答案 2 :(得分:0)

听起来好像你需要在服务器端刷新套接字,尽管确实很难说。如果您无法轻易更改服务器,那么可能有助于嗅探网络连接以查看实际从服务器发送内容的时间。

您可以使用Wireshark等工具来嗅探您的网络。

以下文章介绍了查看向/从手机发送/接收内容的另一个选项:

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

祝你好运!

答案 3 :(得分:0)

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

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

我也可以使用multipart-replace和其他一些更新颖的标题和mime类型来查看它是否有助于刺激NSURLConnection。

答案 4 :(得分:0)

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

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