2009-07-13 88 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/