Установка таймаута для операций сокета

Когда я создаю сокет:

Socket socket = new Socket(ipAddress, port);

Он выдает исключение, которое в порядке, поскольку IP-адрес недоступен. (Контрольные переменные, где String ipAddress = "192.168.0.3" и int port = 300.)

Проблема заключается в следующем: как установить время ожидания для этого сокета?

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

Ответ 1

Используйте Socket() конструктор и connect(SocketAddress endpoint, int timeout) метод.

В вашем случае это будет выглядеть примерно так:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);

Цитата из документации

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException

Соединяет этот сокет с сервером с заданным значением таймаута. Тайм-аут нуля интерпретируется как бесконечный тайм-аут. Затем соединение будет заблокировано до тех пор, пока не будет установлено или не произойдет ошибка.

Параметры:

endpoint - SocketAddress
 timeout - значение таймаута, которое будет использоваться в миллисекундах.

Броски:

IOException - если во время соединения возникает ошибка
  SocketTimeoutException - если истечет время ожидания перед подключением
 IllegalBlockingModeException - если этот сокет имеет связанный канал, а канал находится в неблокирующем режиме
  IllegalArgumentException - если конечная точка равна null или является подклассом SocketAddress, не поддерживаемым этим сокетом

С:        1.4

Ответ 2

Вы не устанавливаете тайм-аут для сокета, вы устанавливаете тайм-аут для операций, выполняемых в этом сокете.

Например socket.connect(otherAddress, timeout)

Или socket.setSoTimeout(timeout) для установки таймаута в операциях read().

Смотрите: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html

Ответ 3

Вы можете использовать следующее решение:

SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);

Надеюсь, что это поможет!

Ответ 4

Вы не можете управлять таймаутом из-за UnknownHostException. Это тайминги DNS. Вы можете управлять таймаутом соединения только с допустимым хостом. Ни один из предыдущих ответов не подходит правильно.

Но мне трудно поверить, что вы действительно получаете UnknownHostException при указании IP-адреса, а не имени хоста.

EDIT Чтобы контролировать тайм-ауты DNS Java см. этот ответ.