Исключение "java. net .ConnectException: Тайм-аут соединения: соединение" выбрасывается до указанного времени ожидания - PullRequest
0 голосов
/ 06 апреля 2020

У меня следующий код:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class ScoketTimeoutMain
{
    public static void main( String[] args )
    {

        Socket socket = new Socket();
        InetSocketAddress address = new InetSocketAddress( "example.com", 81 );
        final long l = System.currentTimeMillis();
        try
        {
            socket.connect( address, 60000 );
        }
        catch( IOException aE )
        {
            aE.printStackTrace();
            System.out.println( System.currentTimeMillis() - l );
        }
    }
}

Время ожидания соединения генерируется примерно через 21 секунду:

java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at com.kulig.ScoketTimeoutMain.main(ScoketTimeoutMain.java:17)
21004

Я не понимаю, почему возникает исключение через 21 секунду вместо 60 секунд ,

=== РЕДАКТИРОВАТЬ ===

Если установить тайм-аут меньше 21 секунды, он будет работать правильно. Например:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class ScoketTimeoutMain
{
    public static void main( String[] args )
    {

        Socket socket = new Socket();
        InetSocketAddress address = new InetSocketAddress( "example.com", 81 );
        final long l = System.currentTimeMillis();
        try
        {
            socket.connect( address, 2000 );
        }
        catch( IOException aE )
        {
            aE.printStackTrace();
            System.out.println( System.currentTimeMillis() - l );
        }
    }
}

java.net.SocketTimeoutException: connect timed out
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at com.kulig.ScoketTimeoutMain.main(ScoketTimeoutMain.java:17)
2002

Таким образом, происходит какое-то другое время ожидания. Я понятия не имею, что может вызвать это и как установить этот другой тайм-аут.

1 Ответ

1 голос
/ 06 апреля 2020

Я получил точно те же 21 секунды (21007). При поиске inte rnet время ожидания 21 секунды не такое уж редкое. На основании этого исправления я изменил параметр Max SYN Retransmissions в TCP и получил тайм-аут на 60 секунд:

netsh interface tcp set global MaxSynRetransmissions=5

Значение по умолчанию: 2.

...