14

我正在开发一个 iPhone 应用程序,它将使用长轮询通过 HTTP 将事件通知从服务器发送到客户端。在服务器上打开连接后,我将发送一小段表示事件的 JSON,因为它们发生了。我发现-[NSURLConnectionDelegate connection:didReceiveData]直到我关闭连接后才会调用它,无论我在创建NSURLRequest. 我已经验证服务器端正在按预期工作 - 第一个 JSON 事件将立即发送,后续事件将在发生时通过线路发送。有没有办法在NSURLConnection这些事件发生时接收它们,还是我需要改为下拉到 CFSocket API?

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

4

5 回答 5

7

NSURLConnection将在下载数据时缓冲数据,并使用该方法将其全部归还给您didReceiveData。该NSURLConnection课程无法区分网络延迟和数据中的故意拆分。

您可能需要使用像您提到的 CFSocket 这样的较低级别的网络 API(您可以访问从网络接口传入的每个字节,并且可以区分有效负载的两个部分),或者您可以使用查看像CURL这样的库,看看那里有哪些类型的输出缓冲/非缓冲。

于 2009-07-13T16:55:25.340 回答
3

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

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

于 2009-10-10T02:13:25.397 回答
0

听起来好像您需要在服务器端刷新套接字,尽管很难确定。如果您不能轻易更改服务器以执行此操作,那么嗅探网络连接以查看实际从服务器发送内容的时间可能会有所帮助。

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

以下文章描述了另一种查看手机发送/接收内容的选项:

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

祝你好运!

于 2009-07-13T16:47:32.877 回答
0

我们目前正在进行一些研发,以将我们的 StreamLink 彗星库移植到 iPhone。

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

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

于 2009-07-22T16:40:52.620 回答
0

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

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

于 2010-05-07T15:53:16.563 回答