Foro de elhacker.net

Programación => Java => Mensaje iniciado por: leinier04 en 23 Agosto 2011, 17:37 pm



Título: Detectar desconexión de socket?
Publicado por: leinier04 en 23 Agosto 2011, 17:37 pm
Buenas,
Estoy empezando a trabajar con socket y a lo mejor es un poco básica mi pregunta pero no logro ver que problema tengo, Estoy conectándome a un servidor que me manda datos constantemente, me conecto sin problemas y proceso los datos pero haciendo pruebas quito el cable de red en el cliente y la aplicación no me lanza ninguna Exception y sin embargo la aplicación me sigue recibiendo datos no se en donde se me quedan y como resolver el problema.
Ahora un poco de mi código para que vean que es lo que hago para conectarme ect.

Código:
private NSocket (String peerhost, int peerport) {
        this.host = peerhost;    //for storing purposes
        this.port = peerport;
        try {
            socket = new Socket();
            socket.setReceiveBufferSize(100); /*Esto lo hago como prueba de reducir el tamaño del buffer del socket para que no me siga tomando datos luego de quitado el cable de red y me lance una Exception pero nada.*/
            socket.setSoTimeout(15000); //El timeout en 15s
            SocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(peerhost), port);
            socket.connect(socketAddress);
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1"), 100); //Es el buffer del cual leo los datos también le pongo un size máximo de 100 tratando de resolver el problema. Pero nada
        } catch (UnknownHostException execpt) {
  execpt.printStackTrace();
        } catch (IOException execpt) {
  execpt.printStackTrace();
        }

Ahora un poco de código de cómo proceso los datos Este código esta dentro de un Hilo diferente.

Código:
  
      public void run() {

            while (continuar) { // Continuar estara siempre en true para que siempre este pidiendo datos
                try {
                    cbuf = new char[100];// Arreglo para almacenar los datos que leo
                    while ((in.read(cbuf, 0, 100)) != -1) {// in fue declarado en el constructor de la clase leo 100 datos del buffer
                        if (!socket.isConnected()){// compruebo que este conectado el socket
                            System.out.println("Exception");
                            throw new Exception("Can't find host " + host);
                        }
                        temp = new String(cbuf);
//Proceso los datos
                    }
                } catch (IOException execpt) {
                    JOptionPane.showMessageDialog(null, "Desconectado Aparato");
      throw new Exception("Can't find host " + host);
                }
            }
        }

Bueno espero que me puedan ayudar y de ante manos gracias por su tiempo.
Saludos.


Título: Re: Detectar desconexión de socket?
Publicado por: Valkyr en 23 Agosto 2011, 20:11 pm
En principio, sí desconectases el cable y por tanto no se pudiese realizar la conexión, a la hora de crear el objeto in:

Código
  1. in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1"), 100);

Debería lanzarte una excepción que por lo que veo capturarías y mostrarías la traza por consola.

Sí estableces la conexión y entonces desconectas el cable podría pasar esto:

Cita de: http://download.oracle.com/javase/7/docs/api/java/net/Socket.html#getInputStream()
Under abnormal conditions the underlying connection may be broken by the remote host or the network software (for example a connection reset in the case of TCP connections). When a broken connection is detected by the network software the following applies to the returned input stream :-

  • The network software may discard bytes that are buffered by the socket. Bytes that aren't discarded by the network software can be read using read.
  • If there are no bytes buffered on the socket, or all buffered bytes have been consumed by read, then all subsequent calls to read will throw an IOException.
  • If there are no bytes buffered on the socket, and the socket has not been closed using close, then available will return 0.

Leyendo ahora sobre el método read de InputStream, he leido lo siguiente:

Cita de: http://download.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[
, int, int)]This method blocks until input data is available, end of file is detected, or an exception is thrown.

Así que en principio debería lanzarte de nuevo una excepción de entrada salida, pero veo que la capturas. ¿Estás seguro de que no muestra nada ni por consola ni el JDialog?. Después de lo que he leído lo único que se me ocurre es que se quede bloqueado esperando a que hayan datos disponibles.

Espero que alguien pueda enfocarte un poco mejor a la solución.

Saludos.