Pregunta 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 un UnknownHostException y obtener el socket para el tiempo de espera?


75
2018-02-11 13:51


origen


Respuestas:


Utilizar el Socket() constructory connect(SocketAddress endpoint, int timeout) método en lugar.

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 - SocketAddress
timeout - el valor de tiempo de espera que se utilizará en milisegundos.

Lanza:

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

Ya que:          1.4


136
2018-02-11 13:54



No establece un tiempo de espera para el socket, establece un tiempo de espera para el operaciones usted realiza en ese zócalo.

Por ejemplo socket.connect(otherAddress, timeout)

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

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


40
2018-02-11 13:54



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!


18
2018-02-11 13:58



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 cuesta creer que realmente estés obteniendo un 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 ver esta respuesta.


8
2018-03-20 09:12



Utilizar el Constructor predeterminado para Socket y luego usar el método connect ().


5
2018-02-11 13:54