2009-07-13 7 views
14

ロングポーリングを使用してHTTP経由でサーバーからクライアントにイベント通知を送信するiPhoneアプリケーションで作業しています。サーバー上で接続を開いた後、イベントが発生したときにJSONの小さなビットを送信します。私は、-[NSURLConnectionDelegate connection:didReceiveData]が、接続を閉じた後で、NSURLRequestを作成するときに使用するキャッシュ設定に関係なく、呼び出されていないことを発見しました。私はサーバーの終わりが期待どおりに動作していることを確認しました。最初のJSONイベントがすぐに送信され、後続のイベントが発生したときにワイヤを介して送信されます。 NSURLConnectionを使用してこれらのイベントが発生したときに受信する方法はありますか、代わりにCFSocket APIにドロップする必要がありますか?NSURLConnectionによるロングポーリング

CocoaAsyncSocketの統合を開始していますが、可能であれば残りのREST/JSONベースのWebサービス構造と比べてはるかに優れているので、引き続きNSURLConnectionを使用することをお勧めします。

+0

ねえ、私はあなたが希望する結果を得るためにasyncsocketを使用したことを見ました。私はいつかこれについてあなたの脳を選ぶことができますか?私はTwitterで@suprfrendsです。それは大いに感謝されるでしょう! –

+0

私は....チェックアウトこれを理解することができた:私が見つけ http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus

+0

解決策はここに私の返信を参照してください: http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus

答えて

7

NSURLConnectionは、ダウンロード中にデータをバッファして、didReceiveDataメソッドを使用して1つのチャンクに戻します。 NSURLConnectionクラスは、ネットワークの遅延と意図的なデータの分割を区別できません。

CFSocketのような低レベルのネットワークAPIを使用する必要があります(ネットワークインターフェイスから各バイトにアクセスし、ペイロードの2つの部分を区別できる)か、 CURLのようなライブラリを見て、どのようなタイプの出力バッファリング/非バッファリングが存在するかを確認することができます。

+1

これは私が恐れていたものです。私は自分でCFSocketを扱うのではなく、CocoaAsyncSocketを使うつもりだと思います。 – pix0r

+0

レコードのために、CocoaAsyncSocketはうまく動作しましたが、すべて正常に動作するにはさらに1〜2時間かかりました。 – pix0r

+0

結局それはうまくいってうれしい! –

0

サーバ側でソケットをフラッシュする必要があるかのように聞こえるが、確かに言うのは本当に難しい。これを行うためにサーバを簡単に変更できない場合は、ネットワーク接続を盗聴して、実際にサーバから何が送信されているかを確認するのに役立ちます。

Wiresharkのようなツールを使用してネットワークを盗聴することができます。

送らなっているものを見するためのもう1つのオプションは、/受信へ/次の資料に記載されている電話機から:

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

幸運!

+0

私はtelnetで接続できます。データが予想通りに徐々に減少していることを確認します。 NSURLConnectionはMattが言及したように常にデータをバッファリングするように思えます。 – pix0r

0

現在StreamLink彗星ライブラリをiPhoneに移植するために、いくつかのR & Dを行っています。

私は、エミュレータでは、1KBのデータが受信されるとdidReceiveDataコールバックを取得することがわかりました。したがって、コールバックの取得を開始するには、1KBブロックの迷惑メールを送信することができます。しかし、デバイス上では、これは起こらないようです。サファリ(デバイス上)で2KBを送信する必要がありますが、NSURLConnectionを使用してもコールバックは発生しません。私は同じアプローチを取らなければならないかもしれないように見えます。

また、NSURLConnectionを刺激するのに役立つかどうかを確認するために、multipart-replaceや他のいくつかの斬新なヘッダーとMIMEタイプで再生することもできます。

+0

代わりにCocoaAsyncSocketの使用をお勧めします。必要な場合は、基本的なHTTPコマンドを自分で実装するだけで十分です。誰がAppleが...将来的に – pix0r

0

ASIHttpRequestという名前の別のHTTP APIの実装があります。それは上記の問題を持っていないし、ファイルのアップロード、クッキー、認証など、ほとんどすべてのHTTP機能のための完全なツールキットを提供しています...

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

+0

をNSURLConnectionを変更する方法を知っていて、それを自分でローリングとは異なりASIHttpRequestはあなたが決める場合、あなたが失うすべてが、などのHTTPプロキシ、認証を扱うように見える「ねえ、それだけでソケット接続に加えて、いくつかを送信するのですヘッダー、それはいかに難しい? " :)TCPやUDP上でCOMETを使用する主な理由の1つは、ファシストの企業ファイアウォールを通過することです。 –

関連する問題