Establecer un tiempo de espera para las operaciones de socket

Cuando creo un socket:

Socket socket = new Socket(ipAddress, port); 

Lanza una excepción, lo cual está bien, porque la dirección IP no está disponible. (Las variables de prueba donde String ipAddress = "192.168.0.3" y int port = 300 )

El problema es: ¿cómo configuro el tiempo de espera para ese socket?

Cuando creo el socket, ¿cómo puedo reducir el tiempo antes de obtener una UnknownHostException y obtener el socket de tiempo de espera?

Utilice el constructor Socket() y, en su lugar, el método de connect(SocketAddress endpoint, int timeout) .

En tu caso, se vería algo así como:

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

Citando de la documentación

connect

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

Conecta este conector al servidor con un valor de tiempo de espera especificado. Un tiempo de espera de cero se interpreta como un tiempo de espera infinito. La conexión se bloqueará hasta que se establezca o se produzca un error.

Parámetros:

endpoint : el SocketAddress
timeout : el valor de tiempo de espera que se usará en milisegundos.

Lanza:

IOException : si se produce un error durante la conexión
SocketTimeoutException : si el tiempo de espera expira antes de conectarse
IllegalBlockingModeException – si este socket tiene un canal asociado, y el canal está en modo no bloqueante
IllegalArgumentException : si el punto final es nulo o si una subclase de SocketAddress no es compatible con este socket

Desde: 1.4

No establece un tiempo de espera para el socket, establece un tiempo de espera para las operaciones que realiza en ese socket.

Por ejemplo socket.connect(otherAddress, timeout)

O socket.setSoTimeout(timeout) para configurar un tiempo de espera en las operaciones de read() .

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

Puede usar la siguiente solución:

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

¡Espero eso ayude!

No puede controlar el tiempo de espera debido a UnknownHostException . Estos son los tiempos de DNS. Solo puede controlar el tiempo de espera de conexión dado un host válido. Ninguna de las respuestas anteriores aborda este punto correctamente.

Pero me resulta difícil creer que realmente está obteniendo una UnknownHostException cuando especifica una dirección IP en lugar de un nombre de host.

EDITAR Para controlar los tiempos de espera de DNS de Java, vea esta respuesta .

Use el constructor predeterminado para Socket y luego use el método connect () .