0

現在、TCPサーバーに接続しようとしています。すべてが本当にうまく機能しますが、サーバーが利用できない場合、アプリは約30秒フリーズし、それはあまり良くありません。解決策を探しましたが、今のところ役立つものが見つかりませんでした。

たぶんあなたの誰かが接続をチェックするための解決策を持っていますか?

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)@"IP_SERVER_PATH", 6666, &readStream, &writeStream);
    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];
4

3 に答える 3

6

メインスレッドでネットワーク操作を実行しないでください。別のバックグラウンドスレッドを使用します。NSThreadを探します。

于 2012-08-09T12:44:02.427 に答える
2

Reachabilityのようなものを使ってみましたか?

Appleによるサンプルプロジェクトがありますが、ARCやGCDで動作するこのプロジェクトなど、Githubには多くの更新があります。

基本的に、ネットワーク接続を監視し、接続が切断されたときにイベントを適切に処理します。

于 2012-08-09T12:43:47.460 に答える
1

H2CO3が言ったように:設計に欠陥があるために30秒間ハングします(テストのみの場合はOK):メインスレッドに待機時間が長く/不確定になる可能性のあるもの(外部接続など)を入れないでください。

そうは言っても、アプリをメッセージングシステムのように動作させることをお勧めします。ユーザーが他の(依存しない)ステップに進んでいる間にバックグラウンドで発生するスレッドに外部通信チェックをコミットします。

ネットワークデータ量に問題がない場合は、タイマーにバックグラウンドスレッドを設定し、この例のように「ハートビート」または「ステイアライブ」メッセージを送信して接続を常にチェックします。そうすれば、ユーザーが陽気に自分のことをしている間、バックグラウンドスレッドをチェックし、必要に応じてリモートサーバーへのソケット接続を再確立することができます。

ソケットサーバーの開発も制御できる場合は、ハートビートメッセージから詳細をログに記録することをお勧めします。それらに順番に番号を付け(またはunixtimeタイムスタンプを付けて)、ログに保存することができます。これにより、問題が実際にどれほど重大であるかを知ることができます。これは、生産的なデバッグツールとして役立つ可能性があります。

そのようです:

A0001、A0002、A0003、B0001、A0004、B0002、B0003、A0005、C0001

ここで、A、B、Cは接続ID(および/または発信元IPなど、関連すると見なされるその他のデータ)です。

于 2013-05-17T17:27:00.573 に答える