Cuando creo un socket:
Socket socket = new Socket(ipAddress, port);
Lanza una excepción, que 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 un UnknownHostException
socket y obtener el tiempo de espera?
Respuestas:
Utilice el
Socket()
constructor y elconnect(SocketAddress endpoint, int timeout)
método en su lugar.En su caso, se vería así:
Socket socket = new Socket(); socket.connect(new InetSocketAddress(ipAddress, port), 1000);
Citando de la documentación
fuente
socket.setSoTimeout(timeoutMillis)
tiempos de espera durante el bloqueo de operaciones de E / S.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 establecer un tiempo de espera en lasread()
operaciones.Ver: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
fuente
socket.setSoTimeout
debe llamarse DESPUÉSconnect
, o no tendrá ningún efecto y las lecturas nunca se agotarán. este es un problema mal documentado.Podría utilizar 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!
fuente
connect()
método, pero no bajo el control de un tiempo de espera.No puede controlar el tiempo de espera debido a
UnknownHostException
. Estos son 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 cuesta creer que realmente obtenga una
UnknownHostException
cuando especifique 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 .
fuente
Use el constructor predeterminado para Socket y luego use el método connect () .
fuente