0

TCP ソケット接続を介してメッセージを送信する必要がある Android 用のアプリケーションを開発しています。メソッドに従ってタイムアウト値を設定しましたconnect(SocketAddress endpoint, int timeout)。現在、connect()メソッドはタイムアウトになるまでブロックSocketExceptionされ、サーバーがオフラインの場合にのみ a がスローされます。ネットワークが無効になっている、ネットワークに到達できないなどの他のすべてのケースでは、タイムアウト値は無視され、メソッドは直接SocketException (ENETUNREACH). そのような場合でもタイムアウトが機能することを確認するにはどうすればよいですか? 必要に応じて追加情報を提供します。

ありがとう

4

2 に答える 2

4

接続タイムアウトは、リモート サーバーから応答がない場合に使用します。それ以外の場合、タイムアウトは適用されません。例えば

  • 接続が成功すると、
  • リモートサーバーが接続を拒否した場合、
  • ネットワーク層が「ホストへのルートがありません」と言ったとき
  • ネットワーク層が「ネットワークへのルートがありません」/「ネットワークに到達できません」と言ったとき。

このような場合、接続の試行はすぐに成功または失敗します。試行を続けたい場合は、再試行可能な障害が発生した場合に再試行するコードで接続呼び出しをラップする必要があります。(そして、ネットワークリソースやバッテリー充電などを浪費しないように、再試行の頻度と停止のタイミングを決定するコードを書くのはあなた次第です。)

于 2013-04-29T07:30:09.473 に答える
0

これがメソッドの意図した動作です。タイムアウトは、接続の確立に時間がかかる場合にのみ関連します。他の理由で接続を確立できないと判断された場合は、時間を無駄にすることなく、すぐにエラーがスローされます。これが、メソッドが内部で実装されている方法です。

于 2013-04-29T07:30:27.390 に答える