Установка таймаута для операций с сокетами - PullRequest
82 голосов
/ 11 февраля 2011

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

Socket socket = new Socket(ipAddress, port);

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

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

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

Ответы [ 5 ]

154 голосов
/ 11 февраля 2011

Используйте взамен 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 - если конечная точка равна нулю или является подклассом SocketAddress, не поддерживаемым этим сокетом

С: 1,4

41 голосов
/ 11 февраля 2011

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

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

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

См .: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html

18 голосов
/ 11 февраля 2011

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

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

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

8 голосов
/ 20 марта 2013

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

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

РЕДАКТИРОВАТЬ Чтобы управлять таймаутами DNS для Java см. Этот ответ .

5 голосов
/ 11 февраля 2011

Используйте конструктор по умолчанию для Socket, а затем используйте метод connect () .

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