2

iPadでサーバーとして使用しているAsyncSocketのインスタンスと、クライアントとして機能している別のiPadで実行されているAsyncSocketソケットがあります。クライアントとサーバーの間でデータを交換するために必要なすべてのコードがあります。問題はありません。

私が経験している問題は、すべて正常に動作することですが、アプリのバグ テスト中に、特に奇妙な (そして苛立たしい問題) に気付きました。

サーバーの iPad をオフにすると (その時点でソケットのデリゲートはサーバー上で起動されません)、クライアントは切断されます (そして、継続的に再試行するループに入ります)。厄介なのは、サーバーが復旧しても、クライアントがまだサーバーに接続できないことです。実際、クライアントを最初から再起動しても、サーバーに接続できません。クライアントが再び接続できるようにするには、サーバー アプリを再起動する必要があります。

奇妙なことに、このバグは、サーバーが実際に上部のボタンから「オフ」(つまり、スタンバイ状態) に切り替えられた場合にのみトリガーされます。ホームボタンを使用してアプリをバックグラウンドに送信するだけの場合、クライアントはサーバーへの接続を維持します。クライアントが切断デリゲートメッセージを受信して​​切断し、再接続を拒否するのは、デバイスが切断されたときだけです。一方、サーバーはこれを完全に認識しておらず、デリゲート メソッドはまったく起動されません。

私の質問を一般化するには:

  • iPad の上部にあるボタンを使用してデバイスをスタンバイ状態にすると、AsyncSocket サーバー インスタンスは正確にどうなりますか?
  • デリゲート メソッドが起動されないのに、接続されているクライアントが切断されるのはなぜですか?
  • デバイスの電源を再び入れるとどうなりますか?
  • クライアントが再接続できないのはなぜですか?
4

1 に答える 1

1

この問題の解決策を見つけることができたので、ここで共有します:-

私のサーバークラスでは、次を追加しました。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];

次に、ソケットが再びリッスンを開始する次のメソッドを追加しました。

- (void)applicationDidBecomeActive {
    NSError *error;
    if (![socket acceptOnPort:kPORT error:&error])
    {
        // error code
    }
}

サーバーがバックグラウンドに入ったときにクライアントの切断を止める方法はまだないので、サーバーが再び利用可能になるまでクライアントをループさせるだけappEnteredForegroundです。再びオンにしました。

于 2011-11-01T16:08:27.450 に答える