Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Xedrox en 28 Agosto 2014, 19:36 pm



Título: Read timeout
Publicado por: Xedrox en 28 Agosto 2014, 19:36 pm
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!


Título: Re: Read timeout
Publicado por: 0vatsug en 29 Agosto 2014, 01:03 am
El método connect de la clase Socket acepta un timeout como segundo parámetro. Ejemplo:

Código
  1. public void createConnection() throws UnknownHostException, IOException {
  2. try {
  3.  
  4. InetAddress addr = InetAddress.getByName("localhost");
  5. int port = 80;
  6.  
  7. SocketAddress sockaddr = new InetSocketAddress(addr, port);
  8.  
  9. // Crea un socket
  10. Socket socket = new Socket();
  11.  
  12. int timeout = 5000;   // medida en milisegundos = 5 seg.
  13.  
  14. /* Conecta el socket con el servidor con un timempo limite especifico (5s)
  15.   Si llega el tiempo limite, una SocketTimeoutException sera lanzada */
  16. socket.connect(sockaddr, timeout);
  17.  
  18. System.out.println("Socket connected..." + socket);
  19.  
  20. }
  21. throw new UnknownHostException("Error: Host desconocido"+e.getMessage());
  22. }
  23. catch (IOException ioe) {
  24. throw new IOException("Error en el flujo de comunicacion "+ioe.getMessage());
  25. }
  26.  
  27. }

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.


Título: Re: Read timeout
Publicado por: Chuidiang en 5 Septiembre 2014, 20:45 pm
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.