1

私の iOS アプリにはソケット通信が必要です。入力ストリームと出力ストリームの設定については、このRay Wenderlich チュートリアルに従っています。私が使用しているサーバーは Twisted です。私のアプリでは、ジャイロスコープ データなどの外部イベントによって生成されたデータの高速バーストを送受信する必要があります。JSON文字列の形式でデータを送受信しています。大部分は、リアルタイム メッセージング チャット アプリに非常によく似ていますが、送受信は非常に高速でバーストです。

したがって、私のアプリのレイアウトは、1 つのビュー コントローラーDViewContorllerと、3 つの tableviewcontrollers を持つ tabbarcontroller があることです。これら 4 つのビュー コントローラーすべてでデータを送受信する必要があるため、App Delegate でソケット ストリームの初期化を実装しました。3 つのタブすべてについて、私の App Delegate は を設定します[self.inputstream setDelegate:self]が、それが にある場合はDViewController、入力ストリームのデリゲートを の参照に設定しますDViewController(void)viewWillDisappearofではDViewController、入力ストリーム デリゲートを AppDelegate の参照にリセットして、入力ストリームの制御を取り戻すようにしました。出力ストリームの場合、デリゲートは常に AppDelegate に設定され、変更されることはありません。

myAppDelegateDViewControllerare<NSStreamDelegate>の両方が実装されています。

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent}
{
}

すべてのストリーム イベント ケースが実装されています。

したがって、基本的に、セットアップ全体がうまく機能しますが、データが高速でない場合に限ります (または、正確な問題を特定できないようです)。

したがって、テスト中に行ったいくつかの観察結果を次に示します (Simulator-iPhone および iPhone-iPhone セットアップを使用)。

A. シミュレーター - iPhone:

  1. このセットアップでは、シミュレーターから iPhone に送信したい方法とまったく同じ方法でデータを高速に送信できますが、iPhone からシミュレーターには送信できません。iPhone はすべての文字列を適切に受け取り、必要に応じて機能します。

  2. iPhone からシミュレーターに送信すると、シミュレーターは一度に 1 つの JSON 文字列しかデータを読み取ることができず、データが高速に送信されると機能しません。高速で送信すると、シミュレーターが受信するすべての文字列が半分になります (半分だけが受信されます)。注: サーバーは完全な文字列を送受信します。すべての文字列が高速であっても、サーバーに問題はありません。

  3. シミュレーターと iPhone の両方から同時にデータを送信すると、たとえ高速であっても、両方がすべての文字列を適切に受信して処理します。

B. iPhone - iPhone:

  1. いずれかの iPhone (両方ではなくいずれかが送信) は、一度に 1 つの JSON 文字列しかデータを受信できず、データが高速に送信されると両方とも機能しません。高速で送信された場合、いずれかの iPhone で受信される文字列はすべて半分になります (半分だけが受信されます)。注: サーバーは完全な文字列を送受信します。すべての文字列が高速であっても、サーバーに問題はありません。

  2. 両方のiPhoneから同時に同時にデータを送信すると、たとえ高速であっても、両方がすべての文字列を適切に受信して処理します。

これらの観察から、iPhone がすべての高速文字列を受信して​​いるのは、同時にサーバーに何かを送信している場合のみであると私は確信しました。または、シミュレーターが iPhone に送信すると、iPhone は何があってもすべてを受信できるため、完全に間違っている可能性があります。シミュレーターから受け取った文字列がiPhoneによって完全に取り込まれているが、その逆ではないという、シミュレーターの動作の違いを知りたいです。iPhone の送信がシミュレーターよりも速すぎるため、送信されたすべての文字列が受信側に登録されないのでしょうか? 誰か私がこれを解読するのを手伝ってください!

注: いずれの場合も、サーバーは完全に機能し、速度に関係なく、完全な長さのデータを送受信します。そして、私はiOS 7を使用しています。

更新 1:わかりました。1 日 中実験して、ようやく動作するようになりました。問題は、まさに私の質問文です。入力ストリームから継続的かつ高速に受信したい場合、出力ストリームはアイドル状態を維持できません。どうしてこうなったのかわからないので、どなたか教えてください。したがって、私が使用しているクイックフィックスは、入力ストリームでバイトを取得するたびに、すぐに空のデータをサーバーに送信して、出力ストリームをアクティブに保つことです。したがって、入力ストリームは完全なデータを高速に読み取ることができます。しかし、それはサーバー リソースの浪費だと感じています。さらに、信頼できるソリューションではありません。具体的な解決策を探しています。出力ストリームの使用率を気にせずにシミュレーターがそれを行う方法を知りたいです。誰でも助けてもらえますか?

更新 2:以前の更新から学ぶと、空のデータをサーバーに送信することではありませんが、送信者から次の文字列を完全に受信したい場合は、送信者 にダミー データを送信する必要があります。データをすばやく完全に終了/受信したい場合は、ダミー/ブランク データでエンド ツー エンド通信を維持する必要があります。誰もがこの問題を抱えていて、それを行うためのより信頼できる/具体的な方法を見つけましたか?

4

0 に答える 0