2011-10-31 15 views
10

私はシンプルなサーバークライアントアプリケーションを持っています。すべて動作しますが、サーバーからの応答を得るには5分以上かかることがあります(これは正常であり、このようにする必要があります)。問題は、5分以上かかると、この例外が発生し続けることです:java.net.SocketTimeoutException: Read timed outJava、ソケットタイムアウトを増やす

WindowsやJava仮想マシンにデフォルトのソケットタイムアウトが設定されているのでしょうか? setSoTimeout()は私にとってはオプションではないので、クライアントコードを変更することはできません。 Windows XPを使用して

...

編集:私は今理解したようソケット接続は、クライアント側で開かれていないことです。そのサーバーから渡されます。だから私はすべてのサーバーのjarファイルを逆コンパイルしました。しかし、まだタイムアウトについては何も見つけられません。

+0

システムプロパティを使用してタイムアウトが設定されていることを確認します。 – JimmyB

+0

@HannoBinder、システムプロパティで何を意味するのか説明できますか? – hs2d

+0

私は[sun.net.client.defaultReadTimeout](http://download.oracle.com/javase/1.4.2/docs/guide/net/properties.html)のようなもの、またはクライアントの方法に適用されるもの接続の。 – JimmyB

答えて

10

デフォルトのソケットタイムアウトは0です。これは決してタイムアウトしないことを意味します。 5分後に実際にタイムアウトすると、コード内で設定されたことを意味します。ソースが利用できず、設定がない場合、クラスを逆コンパイルして、setSoTimeout呼び出しを探してみることができます。

コメントと検索でsetSoTimeout()呼び出しが見つかりませんでしたので、別の方法をとることができます。ちょうどタイムアウトにして、そうであればコールを再試行する小さなスクリプトを書いてください。コマンドラインからクライアントを呼び出すことができれば、出力がstderrになった場合、その出力を解析できます。

+0

私は逆コンパイルして 'setSoTimeout'呼び出しを探しましたが、何も見つけられませんでした。それは他の場所に設定する必要がありますか? – hs2d

8

トラフィックがなくても、未使用のTCP接続を長時間開いておくことはそれほど簡単ではありません。多くのファイアウォール/ルータは、タイムアウト後に未使用のポートを閉じます。

単純なキープアライブプロトコルを実装してダミーパケットを毎回送信することもできますが、クライアントコードに触れることができない場合はおそらくオプションではありません。

編集:クライアントコードで設定されたsetSoTimeout()をオーバーライドする方法はわかりません。

+0

キープアライブパケットで非常に良いアイデア! – benez

+0

@benez私は同意しない。ルータが接続をそれをタイムアウトするような貴重なリソースとみなすならば、それをオープンに保つためにそれをだますことはありません。いずれにしても、とにかく接続の損失を処理する必要があります。キープアライブのpingを追加することは、首には無意味な痛みです。 – EJP

+0

@EJP接続損失を処理するための適切な実装はまだ見ていません。リアルタイムの更新を待っていて、データを同期させるために常に2人の関係者が接続されている必要があります。接続損失は単純な再接続で単純に処理されるわけではありません。あなたは重要なメッセージを見逃したり、遅刻することになります。例えば株式市場は常にハートビートを送信し、ircプロトコルではpongにpingに応答する必要があります。はい、あなたは接続損失に対処しなければなりませんが、いくつかのプログラムではそれらを避けたいかもしれません。 – benez

0

答えは0ですが、デフォルトはタイムアウトではありません。例えば、Axis2クライアントはデフォルトの60秒のタイムアウトを持っているので、呼び出しを行うために使用している実装の種類に依存します。

詳細をお知らせください。回答セクションに書いて申し訳ありませんが、私はコメントをするには十分な評判がありません:)

+0

ここでコードを見ると、 'java.io.InputStream'しか見ることができません。だから接続はサーバーからクライアントに行わなければなりませんか? – hs2d

+0

さて、Javaの場合、デフォルトは無限ですが、ライブラリがそれを変更する可能性があります。たぶんヒント、hs2d、あなたは含まれている瓶がありますか?あるいは、別のアプローチを取って、タイムアウトさせて失敗した場合は再試行することもできます。 – stivlo

0

あなたは接続を維持する必要がありますか?あなたはそれをより非同期にするためにそれを再考してみませんか?そのスキーマはスケーリングされていません。ある時点で、使用可能なすべてのスレッドが、サーバーからの長時間の応答を待っている可能性があります。

+0

彼はそれを読むことを望むなら、彼は接続を生かしておく必要があります。このすべての頭や尾を作ることはできません。 – EJP