Установка таймаута для операций сокета
Когда я создаю сокет:
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 см. этот ответ.
Ответ 5
Используйте конструктор по умолчанию для Socket, а затем используйте connect() метод.