Read timeout

Iniciado por Xedrox, 28 Agosto 2014, 19:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Xedrox

Hola gente , como os va?

   Les hago una consultonta, resulta ser que tengo un programa "Java" que se conecta como cliente (usando la clase Socket) a otro programa. Para leer un mensaje, uso la clase "DataInputStream", el metodo (int read(bytes[])". Resulta ser que muchas veces me conecto a este programa satisfactoriamente, pero a veces no me contesta y me quedo en un "read" eterno, conoces alguna manera de ponerle un timeout a ese read?

Muchas Gracias
Saludos!

0vatsug

#1
El método connect de la clase Socket acepta un timeout como segundo parámetro. Ejemplo:

Código (=java) [Seleccionar]

public void createConnection() throws UnknownHostException, IOException {
try {

InetAddress addr = InetAddress.getByName("localhost");
int port = 80;

SocketAddress sockaddr = new InetSocketAddress(addr, port);

// Crea un socket
Socket socket = new Socket();

int timeout = 5000;   // medida en milisegundos = 5 seg.
   
/* Conecta el socket con el servidor con un timempo limite especifico (5s)
   Si llega el tiempo limite, una SocketTimeoutException sera lanzada */
socket.connect(sockaddr, timeout);

System.out.println("Socket connected..." + socket);
   
}
catch (UnknownHostException e) {
throw new UnknownHostException("Error: Host desconocido"+e.getMessage());
}
catch (IOException ioe) {
throw new IOException("Error en el flujo de comunicacion "+ioe.getMessage());
}

}


Capturando las excepciones lanzadas puedes manejar la lógica de tu aplicación para que no se quede congelada y puedas volver a intentar conectarte. Lo que tienes que mirar es por qué razón esas veces no conecta.

Bendiciones.

Chuidiang

#2
Hola:

El timeout de connect es para la conexión, no afecta a los read.
Para el read(), llama a

socket.setSoTimeout( timeout en milisegundos)

Basta llamar a este método una sola vez, no es necesario hacerlo en cada read.

Te saltará una excepción java.net.SocketTimeoutException si salta el timeout en el read.

Se bueno.