URLがアップしているときに「java.net.ConnectException:接続がタイムアウトしました」という例外が発生するのはなぜですか?


86

私はConnectException: Connection timed out自分のコードからある程度の頻度でを取得しています。ヒットしようとしているURLがアップしています。同じコードが一部のユーザーには機能しますが、他のユーザーには機能しません。1人のユーザーがこの例外を取得し始めると、引き続き例外を取得しているようです。

スタックトレースは次のとおりです。

java.net.ConnectException: Connection timed out
Caused by: java.net.ConnectException: Connection timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.Socket.connect(Socket.java:516)
    at java.net.Socket.connect(Socket.java:466)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
    at sun.net.www.http.HttpClient.New(HttpClient.java:287)
    at sun.net.www.http.HttpClient.New(HttpClient.java:299)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840)

これが私のコードの抜粋です:

URLConnection urlConnection = null;
OutputStream outputStream = null;
OutputStreamWriter outputStreamWriter = null;
InputStream inputStream = null;

try {
    URL url = new URL(urlBase);
    urlConnection = url.openConnection();
    urlConnection.setDoOutput(true);

    outputStream = urlConnection.getOutputStream(); // exception occurs on this line
    outputStreamWriter = new OutputStreamWriter(outputStream);
    outputStreamWriter.write(urlString);
    outputStreamWriter.flush();
    inputStream = urlConnection.getInputStream();
    String response = IOUtils.toString(inputStream);
    return processResponse(urlString, urlBase, response);
} catch (IOException e) {
    throw new Exception("Error querying url: " + urlString, e);
} finally {
    IoUtil.close(inputStream);
    IoUtil.close(outputStreamWriter);
    IoUtil.close(outputStream);
}

7
問題を解決した場合は、1つの回答を承認済みとしてマークしてください:)
Tobias

回答:


84

接続タイムアウト(ローカルネットワークと複数のクライアントマシンを想定)は通常、

a)「ホストへのルートがありません」などのことを送信者に通知せずに単にパケットを食い尽くす途中のある種のファイアウォール

b)ネットワーク構成の誤りまたは回線の過負荷によるパケット損失

c)サーバーに過負荷をかけるリクエストが多すぎる

d)サーバー上で同時に使用可能な少数のスレッド/プロセス。これにより、それらすべてが取得されます。これは特に、実行に時間がかかり、c)と組み合わされる可能性のあるリクエストで発生します。

お役に立てれば。


この問題をデバッグするのに役立ったのは、要求を行っていたサーバーにpingを実行することでした。意図したプライベートIPではなく、パブリックIPに解決されたURLを見つけました。/ etc / hostsファイルの新しいマッピングにより、問題を修正できました。他の誰かが同様の問題に直面した場合に備えて、コメントを追加しています。
Bouramas

31

同じマシンのWebブラウザでURLが正常に機能する場合は、JavaコードがブラウザがURLへの接続に使用しているHTTPプロキシを使用していない可能性があります。


6

エラーメッセージはそれをすべて示しています:あなたの接続はタイムアウトしました。これは、リクエストが特定の(デフォルトの)時間枠内に応答を受け取らなかったことを意味します。応答がなかった理由は、次のいずれかである可能性があります。

a)IP /ドメインまたはポートが正しくない

b)IP /ドメインまたはポート(つまりサービス)がダウンしている

c)IP /ドメインが応答するのにデフォルトのタイムアウトよりも時間がかかっている

d)使用しているポートでの要求または応答をブロックしているファイアウォールがあります

e)その特定のホストへのリクエストをブロックしているファイアウォールがあります

f)インターネットアクセスがダウンしている

g)ライブサーバーがダウンしている、つまり「rest-API呼び出し」の場合。

ファイアウォールとポートまたはIPブロッキングがISPによって実施されている可能性があることに注意してください


4

次のように、出力ストリームを取得する前に接続タイムアウト時間を上げることをお勧めします。

urlConnection.setConnectTimeout(1000);

ここで、1000はミリ秒単位です(1000ミリ秒= 1秒)。


21
それはそれを大幅に上げるのではなく、下げるのです。デフォルトでは約1分であり、増やすことはできず、下げることしかできません
ローンの侯爵2013年

3
  • Telnetを実行して、ファイアウォールの問題を確認してください
  • 実行tracert/tracerouteホップ数を見つける

どこへのtraceroute?
航空機

明らかに、エラーが発生したIPに関係なく。
ジョンロード

2

私は次の方法で問題を解決しました:

System.setProperty("https.proxyHost", "myProxy");
System.setProperty("https.proxyPort", "80");

またはhttp.proxyHost..。


1

これはIPv6の問題である可能性があります(ホストはIPv6 AAAAアドレスを公開し、ユーザーホストはIPv6用に構成されていると考えていますが、実際には正しく接続されていません)。これは、ネットワークMTUの問題、ファイアウォールブロック、またはターゲットホストが(ランダムにまたは発信国に基づいて)異なるIPアドレスを公開している可能性があり、すべてに到達できるわけではありません。または同様のネットワークの問題。

タイムアウトを設定し、適切なエラーメッセージを追加する(特にホストの解決済みアドレスを出力する)以外に、多くのことを行うことはできません。より堅牢にしたい場合は、再試行を追加し、すべてのアドレスを並行して試行し、Javaプラットフォームでの名前解決キャッシュ(ポジティブおよびネガティブ)も調べます。


1

URLがアップしているときに「java.net.ConnectException:接続がタイムアウトしました」という例外が発生するのはなぜですか?

URLConnection(HttpURLConnection / HttpsURLConnection)が不安定であるため。あなたはここここでこれについて読むことができます。私たちの解決策は2つありました。

a)次の方法でContentLengthを設定します setFixedLengthStreamingMode

b)TimeoutExceptionをキャッチし、失敗した場合は再試行します。


0

IP /ホストがリモートホストによってブロックされている可能性があります。特に、攻撃が強すぎると思われる場合はそうです。


0

これが私に起こった理由は、リモートサーバーが特定のIPアドレスのみを許可し、それ自体は許可しておらず、サーバーのURLから画像をレンダリングしようとしたためです...すべてが単に停止し、タイムアウトエラーが表示されます持っていました...

サーバーが独自のIPを許可しているか、実際に存在するリモートURLからレンダリングしていることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.