Заставить socket.connect ждать определенное время, прежде чем он решит, что соединение недоступно - PullRequest
0 голосов
/ 04 ноября 2010

Я выдаю соединение через сокет, используя следующий фрагмент

        Socket socket = new Socket();
        InetSocketAddress endPoint = new InetSocketAddress("localhost", 1234);
        try
        {
            socket.connect(endPoint, 30000);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            // Logging
        }

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

В настоящее время этот параметр 30000, по-видимому, не применяется, так как из отметки времени в моем журнале видно, что в течение 1 секунды определяется, что соединение не установлено.

Как я могу заставить соединение ждать определенное время, прежде чем сдаться?

13:13:57,685 6235 DEBUG [Thread-7]     - Unable to connect to [localhost:1234]
13:13:58,685 7235 DEBUG [Thread-7]     - Unable to connect to [localhost:1234]
13:13:59,695 8245 DEBUG [Thread-7]     - Unable to connect to [localhost:1234]
13:14:00,695 9245 DEBUG [Thread-7]     - Unable to connect to [localhost:1234]

РЕДАКТИРОВАТЬ: API действительно заявляет Connects this socket to the server with a specified timeout value. A timeout of zero is interpreted as an infinite timeout. The connection will then block until established or an error occurs. однако кажется, что я не испытываю такого поведения или не удовлетворяю его, скорее всего, последнее

Ответы [ 4 ]

5 голосов
/ 04 ноября 2010

То, что вы получаете здесь, правильно. connect не будет сидеть на сокете в ожидании, пока не увидит сервер, он попытается подключиться и ждать ответа. если не к чему подключиться, возвращается. если есть к чему подключиться, он будет ждать timeout секунд ответа и завершится неудачей, если ничего не получено.

2 голосов
/ 05 ноября 2010

Необходимо различать несколько возможных исключительных ситуаций.

  1. ConnectException с текстом «отказано в соединении», что означает, что хост подключен и доступен и ничего не слушаетпорт.Это происходит очень быстро и не может быть подвержено тайм-ауту.

  2. NoRouteToHostException: это указывает на проблему с подключением.Опять же, это происходит немедленно и не может быть подвержено таймауту.

  3. UnknownHostException: имена хостов не могут быть разрешены через DNS.Это происходит немедленно или, скорее, после, как правило, короткой задержки DNS и не может быть подвержено тайм-ауту.

  4. ConnectException с любым другим текстом: это может указывать на сбой ответацелевая система.Обычно происходит, когда присутствуют брандмауэры.Может быть подвергнуто тайм-ауту.

Вы делаете правильную вещь, вызывая Socket.connect() с параметром тайм-аута.Если вы этого не сделаете или если вы укажете нулевое время ожидания, используется системное время по умолчанию, которое составляет порядка 60-75 секунд в зависимости от платформы.Это противоречит утверждению Javadoc о «бесконечном таймауте», что неверно.Также вы не можете увеличить тайм-аут сверх этого предела с помощью Socket.connect() с параметром тайм-аута.В качестве альтернативы вы можете использовать каналы сокетов java.nio в неблокирующем режиме с select() для управления тайм-аутом для вас, но вы все равно не можете увеличить тайм-аут сверх значения платформы по умолчанию с помощью этого или любого другого метода.

0 голосов
/ 04 ноября 2010

Когда истекает время ожидания, генерируется исключение SocketTimeoutException, которое вы не перехватываете и не регистрируете. IOException срабатывает, когда «ошибка возникает во время соединения». Тайм-аут никогда не применяется, потому что заранее произошла ошибка.

Изменить: Просто для пояснения: TCP / IP как набор имеет много особенностей, которые могут помешать пакету достичь желаемого результата (пакет SYN / ACK). Если компьютер отвечает на ваш SYN-пакет, информируя ваше приложение о том, что порт закрыт (т. Е. Там нет приложения, работающего / прослушивающего), он вызовет исключение, сообщающее, что невозможно подключиться к этому порт. Если вы хотите отправлять и повторно отправлять пакеты SYN в любом случае, зная, что приложение будет подключено к Интернету, прослушивая этот порт, это будет сделано на другом сетевом уровне (и, насколько я знаю, не доступен с помощью Java out). -of коробки).

0 голосов
/ 04 ноября 2010

Попробуйте scocket.setSoTimeout (timeout) перед подключением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...