web-dev-qa-db-ja.com

Java:ソケット読み取りタイムアウト例外

私は非常にヘビーデューティなプロセスを呼び出そうとしています。平均作業時間は9〜10分と推定されます。

プロセスを実行しているとき、途方もなく巨大な数のタイムアウトを設定しました:99999999。

2分後、次のエラーが発生します。

Java.net.SocketTimeoutException:読み取りがタイムアウトしました

もう少しいじってみましたが、タイムアウトを3000に設定しましたが、予想どおり3秒後に同じエラーが発生しました。

socket.setSoTimeout(99999999)が最大値を120000に設定する理由について何か考えがありますか?

12
Urbanleg

私は同じ問題を抱えていて、解決策は、ソケットへのデータの最後の読み取りまたは書き込みまでsocket.shutdownInput(); socket.shutDownOutput();を使用していませんでした。これにより、ソケットはFIN_WAIT状態になり、閉じる前に2分間待機しました。詳しくは この投稿 をご覧ください。

4
Rotem

明らかに、設定していると思われるタイムアウトを設定していないか、後で誰かがタイムアウトを変更しています。さらに説明を得るには、コードを投稿する必要があります。

W.R. StevensによるTCP/IP Illustrated、 Vol II、#17.4によると、タイムアウトは1000Hzティックという短い時間に保持されるため、11分を超えるタイムアウトは不可能であることに注意してください。これはBSDコードに適用されます。

2
user207421

私はあなたのアプリケーションがどのように機能するかはわかりませんが、無限に設定してみてください ソケットへのタイムアウト

public void setSoTimeout(int timeout)
              throws SocketException

指定されたタイムアウト(ミリ秒単位)でSO_TIMEOUTを有効/無効にします。このオプションをゼロ以外のタイムアウトに設定すると、このソケットに関連付けられたInputStreamread()呼び出しは、この時間だけブロックします。タイムアウトが発生すると、ソケットはまだ有効ですが、Java.net.SocketTimeoutExceptionが発生します。このオプションは、ブロック操作に入る前に有効にする必要があります。タイムアウトは> 0でなければなりません。ゼロのタイムアウトは、無限のタイムアウトとして解釈されます。

あなたがあなたの電話についてより多くの情報を提供するなら、私は答えを改善するかもしれません。

1
F. Mayoral