Enganchado programando un socket en Android

Hola compas!

Aunque programo mucho en C, estoy bastante perdido en Android y llevo mucho mas tiempo del que me gustaria intentando hacer funcionar un socket en una aplicacion.
Escenario: Estoy corriendo un servidor por shell en linux con el comando nc -vvl -p 8888
y en la aplicacion Android lanzo un thread que es donde se crea el socket.

Ahora bien, Si tengo el server corriendo y lanzo la aplicacion me conecta, envio unos datos y los recibo. El problema que tengo es que no puedo detectar cuando esta el socket desconectado.

socket.isConnected() siempre me devuelve true, aunque no esté lanzado el servidor o aunque corte el servidor una vez que conecte la aplicacion ¬_¬

No entiendo nada de nada. ¿Alguien puede decirme que patosería habré hecho para que ocurra esto?

Mil gracias!
Nunca me he movido por Android, pero una miradita rápida me han aclarado unas cosas:
El método isConnected() devuelve el valor true si se ha establecido una conexión correcta, no si se tiene una conexión establecida.. no sé si me entiendes, es decir, en el momento en el que hayas establecido una conexión, independientemente del estado de ésta, devolverá true.

Para saber si se ha cerrado la conexión hay un método (supongo que lo tendrás en las bibliotecas) llamado isClosed() que te devuelve true si la conexión se ha cerrado.

Espero haberte sido de ayuda! :-|
-spyker- escribió:Nunca me he movido por Android, pero una miradita rápida me han aclarado unas cosas:
El método isConnected() devuelve el valor true si se ha establecido una conexión correcta, no si se tiene una conexión establecida.. no sé si me entiendes, es decir, en el momento en el que hayas establecido una conexión, independientemente del estado de ésta, devolverá true.

Para saber si se ha cerrado la conexión hay un método (supongo que lo tendrás en las bibliotecas) llamado isClosed() que te devuelve true si la conexión se ha cerrado.

Espero haberte sido de ayuda! :-|


Gracias por el consejo.
Lo he probado pero sigo en las mismas.
De todos modos el metodo isConnected() en el API de android dice:
public boolean isConnected ()

Returns whether this socket is connected to a remote host.
Returns

    true if the socket is connected, false otherwise.



Que entoendo que devuelve si el socket esta conectado hacia un host remoto.

No sé porque isClosed() me devuelve siempre false y isConnected siempre true [+furioso]
Según la documentación de Oracle devuelve false si la conexión está establecida, en el momento que se cierre la conexión retorna valor true.

No estoy familiarizado con Android, como he dicho, pero si no se es capaz de con una función específica saber el estado de la conexión, por qué no pruebas a desconectar y a realizar una comunicación con el servidor y si te da error ya sabes que se ha desconectado?

Es una solución muy poco ortodoxa, pero no se me ocurre nada, la documentación dice lo contrario a lo que te pasa.. xD

A ver si realmente no estás finalizando la conexión como toca.

Edit: Por lo que leo, la solución que te he dado se usa bastante, al menos eso se dice por stackoverflow, también que ambos métodos te retornan eso porque miran el estado de conexión del socket, no de la conexión. Deberías terminar la conexión, cerrar el socket y comprobar si realmente hay envío de datos y si la funcion isClosed() ya da un valor true.

De todos modos también hay que tener en cuenta que hay un valor definido por CLOSE_WAIT que determina el tiempo que tardará la conexión en finalizar.

Hablo a ciegas y lo que puedo leer, lo siento por no poder hacer más
3 respuestas