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!
El método connect de la clase Socket acepta un timeout como segundo parámetro. Ejemplo:
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.
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.