Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/01/2008, 09:52
chcma
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Gurus sobre Sockets - Detectar conexion perdida.

Buenas tardes de nuevo Foreros Javeros, jeje !!!


Pregunta compleja, que resolvi en .NET, resolvi en C y.... el colmo que en Java parece que es diferente !!!


En C# .NET tengo el siguiente codigo
Código:
        private void DatosLlegados(IAsyncResult iAr)
        {
            Socket objSocket = (Socket)iAr.AsyncState;
            try
            {
                int tamanioDatosRecibidos = objSocket.EndReceive(iAr);
                if (tamanioDatosRecibidos > 0)
                {
                    byte[] bytesDatosReales = new byte[tamanioDatosRecibidos];
                    Array.Copy(bytesDatos, bytesDatosReales, tamanioDatosRecibidos);
                    string txtDatosReales = Encoding.ASCII.GetString(bytesDatosReales);

                    if (DatosRecibidos != null)
                    {
                        string ipClienteConectado = ((IPEndPoint)objSocket.RemoteEndPoint).Address.ToString();
                        int puertoClienteConectado = ((IPEndPoint)objSocket.RemoteEndPoint).Port;
                        this.DatosRecibidos(objSocket, ipClienteConectado, puertoClienteConectado, txtDatosReales);
                    }

                    objSocket.BeginReceive(bytesDatos, 0, bytesDatos.Length, SocketFlags.None, new AsyncCallback(DatosLlegados), objSocket);
                }
                else
                {
                    EliminarCliente(objSocket);
                }
            }
            catch (SocketException exSocket)
            {
                if (exSocket.SocketErrorCode == SocketError.ConnectionReset)
                    EliminarCliente(objSocket);
                else
                {
                    if (DatosErrores != null)
                        this.DatosErrores(MethodBase.GetCurrentMethod().Name, exSocket.Message);
                }
            }
            catch (Exception ex)
            {
                if (DatosErrores != null)
                    this.DatosErrores(MethodBase.GetCurrentMethod().Name, ex.Message);
            }
        }

Como podeis ver al principio del codigo tengo la condicion " if (tamanioDatosRecibidos > 0) ", en la cual ya puedo detectar si ha habido una desconexión (Probocada o no). Con mi cliente java, me conecto a mi servidor .NET, cierro inesperadamente mi cliente java y el servidor ya detecta que ha habido una desconexión. (Sin necesidad de implementar pings, keepalive ni nada).


Bien, pues estoy intentando lo mismo con mi cliente Java, que si cierro mi servidor .NET inesperadamente el cliente detecte que ha perdido la conexion, para ello tengo el siguiente codigo:

CLIENTE JAVA
Código:
				try
				{				
					while(true)
					{							
							int tamanioRecibido = objStreamLectura.available();
							if(tamanioRecibido>0)
							{
								byte[] bytesRecibidos = new byte[tamanioRecibido];
								
								objStreamLectura.read(bytesRecibidos, 0, tamanioRecibido);
								String txtDatos = new String(bytesRecibidos);
								
								txtCaja.setText(txtCaja.getText() + txtDatos + " [PRUEBA]" + "\r\n");
								if(finalizarHebra)
									return;
							}
					}
				}
				catch (Exception e)
				{
					txtCaja.setText(e.getMessage());
				}


Como ven, lo tengo practicamente igual, solo que en este caso si a la condicion " if(tamanioRecibido > 0) " le meto un else, esta entrando constantemente por ahí aun que esté conectado. Lo que yo necesitaria es pues... que al recoger los datos disponibles " int tamanioRecibido = objStreamLectura.available(); " se quedara ahi en tiempo de espera hasta que reciba algo. En caso de desconectarse recibirá 0 y en cualquier otro caso recibirá X bytes.

En fin, espero haberme explicado y puedan resolverme el problema de detectar cuando se ha terminado la conexión. Desde ya, muchas gracias.
__________________
Charlie.