を使用してHTTPS経由でシリアル化されたオブジェクトを送信することにより、サーバーと通信するWebstartクライアントがありますjava.net.HttpsURLConnection
。
私のローカルマシンとオフィスにあるテストサーバーではすべてが完全に正常に動作しますが、非常に奇妙な問題が発生しています。私が知っているこれらのサーバーと私たちのオフィスのサーバーの主な違いは、それらが別の場所にあり、クライアントとサーバー間の通信がかなり遅いということですが、これ以前の本番環境でも長い間問題なく動作していました.
とにかく、ここで何が起こっているのですか:
- クライアントは、読み取りタイムアウトなどのオプションや などのプロパティを設定した後、それを呼び出し
Content-Type
て、書き込み先のストリームを取得します。HttpURLConnection
getOutputStream()
- この時点で、私が知る限り、クライアントはしばらくハングします。
- その後、クライアントは次の例外をスローします。
java.net.ConnectException: 接続タイムアウト: 接続 java.net.PlainSocketImpl.socketConnect(ネイティブメソッド)で java.net.PlainSocketImpl.doConnect で (不明なソース) java.net.PlainSocketImpl.connectToAddress (不明なソース) で java.net.PlainSocketImpl.connect で (不明なソース) java.net.SocksSocketImpl.connect で (不明なソース) java.net.Socket.connect で (不明なソース) com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect で (不明なソース) com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect で (不明なソース) sun.net.NetworkClient.doConnect で (不明なソース) sun.net.www.http.HttpClient.openServer (提供元不明) sun.net.www.http.HttpClient.openServer (提供元不明) sun.net.www.protocol.https.HttpsClient.(不明なソース) sun.net.www.protocol.https.HttpsClient.New (不明なソース) で sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient (不明なソース) で sun.net.www.protocol.http.HttpURLConnection.plainConnect (提供元不明) sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect で (不明なソース) sun.net.www.protocol.http.HttpURLConnection.getOutputStream (不明なソース) で sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream (不明なソース) で
これは ではないことに注意してください。これは、接続が確立される前にタイムアウトが発生した場合にonSocketTimeoutException
のconnect()
メソッドがスローすると言われています。HttpURLConnection
また、これが発生すると、電話をかけることができconn.getResponseCode()
、応答コード 200 が返されます。
- サーバー側では、のコンストラクターで
EOFException
がスローされObjectInputStream
、シリアライゼーション ヘッダーを読み取ろうとしますが、クライアントがOutputStream
に書き込むことができないため失敗します。
それが役立つ場合は、呼び出しのHttpsURLConnection
前に行われている呼び出しを次に示しますgetOutputStream()
(これを行うコードの構造全体ではなく、行われている呼び出しのみを表示するように編集されています)。
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setReadTimeout(30000);
conn.setRequestProperty("Cookie", cookie);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-java-serialized-object");
conn.getOutputStream();
問題は、これがどのように発生するのか見当がつかないということです。特に、それがたまにしか発生せず(明確なアクティビティのパターンがわからない)、さらにクライアントとサーバ。
についてこれまでに発見できたことを考えるとjava.net.ConnectException: Connect timed out
、サーバーが実行されているネットワーク上のネットワークまたはファイアウォールの問題ではないかと思いました...しかし、リクエストが明らかにサーブレットに到達しています。また、同じネットワーク上で実行されている他のアプリでは、同様の問題は報告されていません。
これの原因が何であるか、または私が何を調査すべきかさえ誰かが考えていますか?