10

ランダムなプロキシを介して Web サイトへの httpurl 接続を開くプログラムを作成しました。私の httpurlconnection はconnと呼ばれます。conn.setConnectTimeout(40000)これらのプロキシの一部が遅すぎる可能性があることがわかったので、接続のタイムアウトをとで 40000 ミリ秒に設定しましたconn.setReadTimeout(40000)

その後、次のコードを取得しました。

long diff = 0;
    long starttime = 0;
    long endtime = 0;

    try
    {
        starttime = System.currentTimeMillis();
        conn.connect();

        endtime = System.currentTimeMillis();

        diff = endtime - starttime;

        if (endtime <= starttime + conn.getConnectTimeout())
        {
            //Trying to read sourecode
            InputStreamReader isrConn = new InputStreamReader(conn.getInputStream());
            BufferedReader brConn = new BufferedReader(isrConn);

            line = brConn.readLine();

            while (line != null)
            {

                response += line + "\t";
                try
                {
                    line = brConn.readLine();
                } catch (IOException e)
                {
                    printError("Reading sourcecode failed.");
                }

            }
        }
        else
        {
            response = "blabla.";
        }




    // If conn.connect failed   
    } catch (IOException e)
    {
        endtime = System.currentTimeMillis();
        diff = endtime - starttime;

        response = "Message: "+e.getMessage() +" MyTimeout:"+ conn.getConnectTimeout() +" Actual time passed:  "+ diff;
               e.printStackTrace();


    }

接続が失敗する理由があるため、多くの場合、最後の catch-block に到達し、次の出力を取得します。


メッセージ: 接続タイムアウト: connect MyTimeout:40000 実際の経過時間: 21012

メッセージ: 接続タイムアウト: connect MyTimeout:40000 実際の経過時間: 21016

メッセージ: 接続タイムアウト: connect MyTimeout:40000 実際の経過時間: 21010

メッセージ: 接続タイムアウト: connect MyTimeout:40000 実際の経過時間: 21009


私の質問は次のとおりです: タイムアウトを 40000 ミリ秒に設定しましたが、約 21000 ミリ秒後に「接続がタイムアウトしました」という応答が返されました。

編集: Windows 7 を使用していますが、コメントで説明されているように、キャッチ ブロックに e.printStackTrace() を追加しました。今までありがとう。出力は次のとおりです(例):

java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient$1.run(Unknown Source)
    at sun.net.www.http.HttpClient$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.http.HttpClient.privilegedOpenServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at TestThread.getSourcePage(TestThread.java:361)
    at TestThread.aChecker(TestThread.java:216)
    at TestThread.getNextProxy(TestThread.java:169)
    at TestThread.getNextC(TestThread.java:157)
    at TestThread.aChecker(TestThread.java:273)
    at TestThread.getNextProxy(TestThread.java:169)
    at TestThread.aChecker(TestThread.java:295)
    at TestThread.getNextProxy(TestThread.java:169)
    at TestThread.getNextC(TestThread.java:157)
    at TestThread.run(TestThread.java:103)
    at java.lang.Thread.run(Unknown Source)

Message: Connection timed out: connect MyTimeout:40000 Actual time passed:  21015
4

2 に答える 2

11

あなたが得た例外を見てください:
最大の手がかり: あなたは取得していjava.net.ConnectException ますjava.net.ConnectException

public class ConnectException
extends SocketException

Signals that an error occurred while attempting to connect a socket to a remote address and port. 
Typically, the connection was refused remotely (e.g., no process is listening on the remote 
address/port)

HttpUrlConnection で設定した内容:
接続のタイムアウト (リモート ポートが接続を受け入れる場合)。接続タイムアウトが期限切れになるjava.net.SocketTimeoutExceptionと、 ではなく が表示されjava.net.ConnectExceptionます。

それで、何が原因java.net.ConnectExceptionですか?
次のテストケースを試しました:

   +------------+------------+----------------+------------------+---------------------------------+ 
   | Valid Host | Valid Port | Valid Proxy IP | Valid Proxy Port | Exception                       | 
   +------------+------------+----------------+------------------+---------------------------------+ 
#1 | yes        | yes        | -NA-           | -NA-             | -- none --                      |
#2 | yes        | no         | -NA-           | -NA-             | java.net.ConnectException       |
   +------------+------------+----------------+------------------+---------------------------------+ 
#3 | yes        | yes        | yes            | yes              | -- none --                      |
#4 | yes        | no         | yes            | yes              | java.net.SocketTimeoutException |
#5 | yes        | yes        | yes            | no               | java.net.ConnectException       |
   +------------+------------+----------------+------------------+---------------------------------+ 
  • ケース #1、#3 は、すべての構成が正しい場合のハッピー パスです。
  • ケース #4 では、java.net.SocketTimeoutExceptionJava プロセスが (プロキシ ポートへの) 接続を確立できるため、取得しますが、ターゲット ホストのポート番号が無効であるため、読み取るデータを取得できません。
  • ケース #2、#5 は、java.net.ConnectExceptionJava プロセスが書き込み/読み取りを試行するポートが無効であるためです。
  • Java プロセスが接続しようとしているポートでリッスンしているプロセスがない場合、接続タイムアウト値は適切に保持されません。そのため、タイムアウトが期限切れになる前に ConnectException を取得します

Message: Connection refused: connect MyTimeout:10000 Actual time passed: 6549 java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) .... ....

結論:

  • 接続しようとしていたプロキシの一部がダウンしている必要があります。したがって、Javaプロセスがスローされましたjava.net.ConnectException
  • プロキシをキャッチjava.net.ConnectExceptionして無効/ダウンとしてマークすることをお勧めします
于 2013-12-23T21:20:36.460 に答える