Foros del Web » Programación para mayores de 30 ;) » Java »

Detectar desconexión de socket?

Estas en el tema de Detectar desconexión de socket? en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 23/08/2011, 08:02
 
Fecha de Ingreso: septiembre-2010
Mensajes: 20
Antigüedad: 13 años, 7 meses
Puntos: 2
Detectar desconexión de socket?

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 a la aplicación.

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.
  #2 (permalink)  
Antiguo 23/08/2011, 12:11
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Detectar desconexión de socket?

Hola:

Un socket es una conexión muy segura una vez establecida y está pensada precisamente para "resistir" desconexiones por culpa del cable y todo eso. Si quitas el cable, pueden pasar varios minutos antes de que se de la conexión por perdida.

A nivel de sistema operativo, todos los envíos que haga tu programa se guardan en un buffer y es el sistema operativo el que se encarga de enviar esos datos por la red cuando pueda. Por eso, aunque quites el cable, tu programa puede seguir enviando (en apariencia) datos. Si sigues enviando datos y sin conectar el cable, en algún momento se llenará el buffer y obtendrás un error al intentar enviar.

Si quieres detectar más rápido la pérdida de cable, no te queda más remedio que hacer algún tipo de protocolo a nivel de aplicación, enviando un mensaje periódico cada x tiempo (segundos), de forma que si no se recibe, tu aplicación considere perdida la conexión.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 23/08/2011, 16:05
 
Fecha de Ingreso: septiembre-2010
Mensajes: 20
Antigüedad: 13 años, 7 meses
Puntos: 2
Respuesta: Detectar desconexión de socket?

Buenas chuidiang,
Gracias por tu pronta respuesta pero no puedo enviar un mensaje cada cierto tiempo desde el servidor y en tal caso como existe algún buffer que está lleno y no sé cuál es, el mensaje estaría en el buffer hasta que este quede vacío y seguiré con el problema, estoy tratando de resolver el problema desde el cliente, si tienes alguna otro idea por favor te la agradecería.
Saludos.
  #4 (permalink)  
Antiguo 24/08/2011, 10:02
 
Fecha de Ingreso: septiembre-2010
Mensajes: 20
Antigüedad: 13 años, 7 meses
Puntos: 2
Respuesta: Detectar desconexión de socket?

Buenas,
Sigo sin resolver el problema, Alguien tiene alguna idea de que cosa pueda hacer.
Saludos.

Etiquetas: jar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:45.