Ver la versión completa : [Ayuda] No me salta excepcion!! sockets en Android!!! ( Java)
Estoy un poco quemado, llevo un par de horas con el problema más ridiculo que os podais imaginar:
-Creo un socket
-Establezco la conexion con el servidor tcp
-Bucle de envio de datos
-Cierro el servidor tcp
Y el socket ni se entera!! Sigue enviando datos como si no pasase nada!!
public void inicio(String direccion, int puerto) {
try {
//Creo una conexion al socket servidor
socket = new Socket(direccion,puerto);
Log.e("Ececpcion" ,"Socket abierto");
aux1 = socket.getOutputStream();
out = new DataOutputStream(aux1);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
TimerTask timerTask = new TimerTask()
{
public void run()
{
try{
Log.e("E", "Enviamos datos");
out.writeBytes("Envio datos"+"\r\n");
}catch (IOException e) {
// TODO: handle exception
Log.e("Ececpcion" , "Error: "+e);
}
}
};
// Aquí se pone en marcha el timer cada segundo.
Timer timer = new Timer();
// Dentro de 0 milisegundos avísame cada 1000 milisegundos
timer.scheduleAtFixedRate(timerTask, 0, 3000);
} catch (UnknownHostException e) {
Log.e("Ececpcion" , "No puedo conectarme a " + direccion + ":" + puerto);
} catch (IOException e) {
Log.e("Ececpcion" , "Error de E/S en " + direccion + ":" + puerto);
}
}
¿A alguien se le ocurre que es lo que puede estar pasando?
:brindis::brindis:
GameMaster
09/11/2010, 00:25
No veo donde lo cierras, y encima tampoco veo donde llamas el procedimiento inicio
^MiSaTo^
09/11/2010, 00:58
Seguramente sea porque tienes que tener el socket en un thread aparte (al menos así lo tengo yo en el droidChat y juraría que también me dio problemas por eso).
GameMaster es que solo he puesto el metodo en el que creo el socket jejejeje
Misato lo que hago es:
-Desde el Activity creo un service para que no se reinicie al girar la pantalla.
-Desde el service lanzo una clase "principal" desde la que voy a lanzar las cosillas que necesitara mi aplicación.
-Desde "principal" lanzo un thread con una clase cliente TCP que es la que no se empana de nada :llorosa:
jduranmaster
09/11/2010, 09:37
tienes que enviar de forma obligada datos cada segundo?
< - >
donde paras el timer?
Enviaría datos cada X segundos, dependerá de un parametro que configure el usuario. Lo importante es que la conexión ha de estar activa para que el servidor le pueda enviar algun comando al cliente para que muestre algo en pantalla (avisos, chats etc...).
:brindis::brindis:
jduranmaster
09/11/2010, 09:40
pero no cierras el timer o si lo haces?
El timer esta solo de prueba para que simule que se esta enviando algo cada 3 segundos como lo haría una vez terminado el programa.
Una vez terminada la aplicación ese "out.writeBytes("Envio datos"+"\r\n");" estará dentro de un metodo que será llamado cada X segundos para enviarle unos datos. Ahora lo tengo así hasta que consiga que rule ;).
Puede ser problema de "exceso de objetos en cascada"? Es decir, que un objeto llama a otro objeto etc... vamos, es una estupidez que se me ha ocurrido ahora mismo jeje.
:brindis::brindis:
jduranmaster
09/11/2010, 09:45
en lugar de usar el timer, no es mas sencillo usar:
public boolean isConnected(): Returns the connection state of the socket.
Returns:
true if the socket successfuly connected to a server
de esta forma antes de enviar compruebas si el socket sigue abierto. puedes hacer un bucle con este metodo y algun sleep cada 1000 milis y dentro de el envias.
< - >
Puede ser problema de "exceso de objetos en cascada"? Es decir, que un objeto llama a otro objeto etc... vamos, es una estupidez que se me ha ocurrido ahora mismo jeje.
:brindis::brindis:
lo dudo, precisamente la potencia de los lenguajes de alto nivel está en cosas como esa.
El isConnected fue lo primero que usé.
Puse un if(isConnected)... y si no estaba conectado pues que volvera a lanzar la conexión...de forma que tuviese que estar pendiende la excepciones para relanzar la conexión (lo cual es una chapuza...)
El problema es que SIEMPRE me devolvía "true" :lamer:, creo que el problema para ambos casos es el mismo, el socket no se empana de si esta o no desconectado :(.
En Java tu copias y pegas mi metodo en una clase sencillita para que lo ejecute y funciona perfectamente, en cambio en Android ni no :lamer:.
:brindis::brindis:
jduranmaster
09/11/2010, 10:10
tu programa es cliente o servidor??
jduranmaster
09/11/2010, 10:18
a vale eres cliente. no me habia fijado que usabas la clase java.net.Socket.
lo de usar isConnected si lo piensas (me acabo de dar cuenta) es una tonteria porque preguntas si la conexión esta "viva" y como el servidor esta siempre en pie (a no ser que el servidor casque) te va a devolver siempre true.
cuando quieres cerrar la conexion? en algun momento en especial?
< - >
es decir envias datos y cierras o como?
< - >
cuan dices: Cierro el servidor tcp
a que te refiers a que cierras la conexion del lado cliente con el servidor no?
Hombre lo de isConnected sería lo suyo, antes de enviar nada lo compruebas y si te devuelve false pruebas a volver a conectar :) y si conecta envias, sino esperas un rato y vuleves a intenarlo :).
La conexión quiero que este permanentemente activa, cuando digo que cierro la conexion es que paro el servidor para ver si el cliente se empana y así poder para que se conecte de nuevo ;).
:brindis::brindis:
^MiSaTo^
09/11/2010, 10:51
Dejame que eche un ojo al código del droidChat, que mi socket tb está vivo permanentemente (a no ser que el usuario haga quit) y recibiendo cosas del server XD
Y ahora te digo, porque así de memoria pues no lo se.:brindis:
Ok Misato! Muchas gracias!! :amor2:
^MiSaTo^
09/11/2010, 10:55
Ok Misato! Muchas gracias!! :amor2:
Pero dame un rato, que me acabo de levantar y estoy desayunando XD
Pero dame un rato, que me acabo de levantar y estoy desayunando XD
jajaja no te preocupes voy a tomar el cafe de las 11 que yo toy en el curro y esto es un "proyecto personal" jejeje.
:brindis::brindis:
^MiSaTo^
09/11/2010, 11:07
jajaja no te preocupes voy a tomar el cafe de las 11 que yo toy en el curro y esto es un "proyecto personal" jejeje.
:brindis::brindis:
Pues en el droidChat yo hago lo siguiente (por cierto, que código más guarro por dios xDDD):
Tengo la clase Chat, la clase ChatHandler y la clase ChatSocket. Bueno la clase ChatHandler controla los mensajes que se envían y se reciben del server, y la ChatSocket pues es el socket. Y la clase Chat, contiene una instancia de ambas y es la que se encarga de organizar el cotarro: lanzar el socket y demás.
Con este código instancio el socket:
socket = new ChatSocket(SERVER, PORT, NICK, USER, CHANNEL);
tSocket = new Thread(socket);
tSocket.start();
Y este es el código del run del socket:
public void run() {
try {
if (socket == null){
Log.d("[DROIDCHAT]", "Conecting to "+SERVER+":"+PORT);
socket = new Socket(SERVER, PORT);
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new PrintWriter(socket.getOutputStream(), true);
conectar(); //comandos de IRC
while (socket.isConnected()){
String reply = ""
if (input.ready()) {
reply = input.readLine();
Log.d("[DROIDCHAT]","[SERVER]"+ reply);
if (reply.startsWith("PING :")) {
sendCommand("PONG :" + reply.split(":")[1] +EOF);
Log.d("[DROIDCHAT]", "[SENT] PONG :" + reply.split(":")[1] +EOF);
//continue;
}
else {
sendMessageToHandler(reply);
}
}
}
socket.close();
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("[DROIDCHAT]","UnknownHostException: "+ e.getMessage());
sendMessageToHandler(e.getMessage());
} catch (IOException e) {
e.printStackTrace();
Log.d("[DROIDCHAT]", "IOException: "+e.getMessage());
} catch (Exception e){
e.printStackTrace();
Log.d("[DROIDCHAT]","Exception: "+ e.getMessage());
}
}
Por lo que veo uso lo de isConnected xDD Es un código que hice hace 2 años o así, vamos que casi ni me acuerdo de él, pero la conexión la mantiene activa aunque tú no envíes nada, ni en el servidor envíen nada ;)
No se si te servirá de algo, espero que sí :brindis:
Creo que la he liado yo al crear el hilo :lamer:, jue luego lo pruebo cuando llegue a casa y os cuento ;) ;).
Gracias a los 2 :D :D :D :D
PD: Misato se esta moviendo lo de este finde! :D:D:D
^MiSaTo^
09/11/2010, 11:29
Creo que la he liado yo al crear el hilo :lamer:, jue luego lo pruebo cuando llegue a casa y os cuento ;) ;).
Gracias a los 2 :D :D :D :D
PD: Misato se esta moviendo lo de este finde! :D:D:D
Jue pues avísame porque ya ni me acordaba XDDDDD Esque llevo 2 semanas de curro paburrir y estoy desconectada del mundo real xD:brindis:
Jue pues avísame porque ya ni me acordaba XDDDDD Esque llevo 2 semanas de curro paburrir y estoy desconectada del mundo real xD:brindis:
Ok jejeje cunado sepa algo más te aviso ;) ;), sobre todo el tema del hotel y hora de llegada :D :D por que lo suyo será quedar en el hotel si os pilla a mano y ya ir todos juntos a la mani :D :D :D.
:brindis::brindis:
^MiSaTo^
09/11/2010, 11:42
Ok jejeje cunado sepa algo más te aviso ;) ;), sobre todo el tema del hotel y hora de llegada :D :D por que lo suyo será quedar en el hotel si os pilla a mano y ya ir todos juntos a la mani :D :D :D.
:brindis::brindis:
Por qué zona estais mirando hotel? Seguro que me pilla a mano :P Con la moto fijo que llego en un pispas xD
Por qué zona estais mirando hotel? Seguro que me pilla a mano :P Con la moto fijo que llego en un pispas xD
Creo que no se ha mirado nada de nada :lamer:, siempre que hemos ido hemos acabado en Barajas, pero estaban mirando algo por la ¿A1? no estoy seguro...
:brindis::brindis:
^MiSaTo^
09/11/2010, 11:44
Creo que no se ha mirado nada de nada :lamer:, siempre que hemos ido hemos acabado en Barajas, pero estaban mirando algo por la ¿A1? no estoy seguro...
:brindis::brindis:
Bueno pues ya me contarás cuando esté más concreto el tema ;)
Bueno pues ya me contarás cuando esté más concreto el tema ;)
Cuenta con ello :brindis::brindis:
< - >
No he conseguido que rule de ninguna de las maneras :lamer:. He crado un proyecto nuevo pelado y tampoco va.
Lo he subido a megaupload a ver si podeis echarlo un vistazo y probarlo por que me tiene quemadisimo... también he metido el programa Hercules.exe que puede simular un servidor TCP para hacer las pruebas.
Ojo que esta puesto para que rule en android 2.1 (en el manifest esta puesto el sdk 7).
http://www.megaupload.com/?d=DAA18XKZ
:llorosa::llorosa::llorosa::llorosa::llorosa::llor osa:
GameMaster
23/01/2011, 12:16
No funciona el link, resube please.
tSuKiYoMi
23/01/2011, 12:28
Es posible que a estas alturas ya lo haya solucionado.
Hola compañeros! Pues si tSuKiYoMi, ya lo conseguí solucionar hace tiempo jejeje.
El tema es que "por alguna razón" Android no se cosca de que esta desconectado hasta que no intentas leer algo del socket, entonces es cuando se da cuenta de que ha perdido la conexión y da la debida excepción cuando java no necesita para nada hacer esto para darse cuenta, con escribir valía ;) ;).
Gracias por tu interes GameMaster! Si estas con algo parecido y te puedo echar un cable dimelo ;).
:brindis::brindis:
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.