91

私は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);
}
4

10 に答える 10

90

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

a) 送信者に「ホストへのルートがありません」などのことを伝えることなく、単にパケットを消費する途中のある種のファイアウォール

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

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

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

お役に立てれば。

于 2008-09-17T19:48:33.120 に答える
34

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

于 2008-09-17T20:12:03.343 に答える
7

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

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

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

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

d)使用しているポートに関係なく、リクエストまたはレスポンスをブロックしているファイアウォールがあります

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

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

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

ISP によって、ファイアウォールとポートまたは IP のブロックが設定されている場合があることに注意してください。

于 2017-05-16T06:52:16.273 に答える
5

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

urlConnection.setConnectTimeout(1000);

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

于 2008-09-17T20:34:54.380 に答える
4
  • Telnetを実行して、ファイアウォールの問題を確認してください
  • ホップ数を見つけるためにtracert/を実行しますtraceroute
于 2008-11-29T15:20:30.150 に答える
0

あなたのIP/ホストがリモートホストによってブロックされている可能性があります.特に、あなたがあまりにも強く打っていると思われる場合.

于 2008-09-17T19:45:37.103 に答える
0

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

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

于 2016-04-19T18:21:38.827 に答える