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

Problema con socket en aplicacion cliente

Estas en el tema de Problema con socket en aplicacion cliente en el foro de Java en Foros del Web. Buenas tardes ya he hecho algunas aplicaciones con sockets en java, y no he tenido mayor problema, hoy en dia tengo un problema de desconexion ...
  #1 (permalink)  
Antiguo 21/02/2013, 14:19
 
Fecha de Ingreso: febrero-2013
Mensajes: 3
Antigüedad: 11 años, 2 meses
Puntos: 0
Problema con socket en aplicacion cliente

Buenas tardes ya he hecho algunas aplicaciones con sockets en java, y no he tenido mayor problema, hoy en dia tengo un problema de desconexion de mi socket, esto obvimente sucede al saltarse una excepcion de desconexion IO debido al timeout en el metodo read, obviamente luego manejo la excepcion y en mi lazo reconecto el socket pero esto me sucede muy seguido y no logro una comunicacion fluida, ayudenme a encontrar la razon
Incluyo el codigo de el hilo principal

@Override
public void run (){
initServer();
}

private void initServer() {
char byteBuffer;
while(true){
try {
System.out.println(address+" "+port);
conexion = new Socket( address, port );
refIco.setIcon(GUI.redOk);
conexion.setKeepAlive(true);
conexion.setSoTimeout(500);
System.out.println( "Conectado a: " + conexion.getInetAddress().getHostName() );
// establecer flujo de salida para los objetos
salida = new DataOutputStream( conexion.getOutputStream() );
salida.flush(); // vaciar búfer de salida para enviar información de encabezado
// establecer flujo de entrada para los objetos
entrada = new DataInputStream( conexion.getInputStream() );
while(true){
//System.out.println("leyendo"+entrada.available());
byteBuffer = (char) entrada.readByte();
//System.out.println("leido : "+(int)byteBuffer);
if(byteBuffer == 13){
if(check){// control de caracter inicial
System.out.println(buffer);
IdentificarCmd(); // se procesa la trama recibida

check = false;

//cerrarConexion();
//break;

}
}
else if (byteBuffer == 58){
buffer.delete(0, buffer.length());
buffer.append(byteBuffer);
check = true;
}
else {
buffer.append(byteBuffer);
}

}

} catch (EOFException ex) {
System.err.println("Se interrumpio la conexion");
refIco.setIcon(GUI.redBad);

} catch (IOException ex) {
System.err.println("timeout al leer inputStream...");
//playAudio();
refIco.setIcon(GUI.redBad);
//Logger.getLogger(ServerPort.class.getName()).log(L evel.SEVERE, null, ex);


} finally {
//cerrarConexion();
}
}
}


espero me puedan ayudar lo mas rapido posible

Última edición por danielinkmetal; 21/02/2013 a las 14:43
  #2 (permalink)  
Antiguo 21/02/2013, 15:13
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema con socket en aplicacion cliente

Auméntale el timeout, medio segundo seguramente no es suficiente.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 21/02/2013, 15:37
 
Fecha de Ingreso: febrero-2013
Mensajes: 3
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Problema con socket en aplicacion cliente

Gracias por tu respuesta, intentare con otros tiempos, sin embargo esto podria causar que la aplicacion espere demasiado tiempo al metodo readByte(), y es raro que se desconecte pues utilizo putty para conectarme al mismo servidor y la comunicacion es continua, podria algo de las operaciones despues de obtener la trama provocar esto???, aunque me parece poco probable
  #4 (permalink)  
Antiguo 21/02/2013, 15:57
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Problema con socket en aplicacion cliente

Hola:

SoTimeout hace saltar una excepción InterruptedIOException que es hija de IOException, podrías separar ambas para ver si es realmente un tiemout u otro problema.

readByte se queda esperando un byte, aunque la conexión con el otro servidor sea fluida como dices que pasa con putty, si el servidor no envía nada en 500 ms, te saltará la excepción. Viendo el código, yo quitaría totalmente el Timeout, no parece que ese código tenga otra cosa que hacer si no llega un dato, así que no veo problema en que se quede eternamente, si hace falta, bloqueado en el readByte.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 22/02/2013, 00:23
 
Fecha de Ingreso: febrero-2013
Mensajes: 3
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Problema con socket en aplicacion cliente

Gracias por tu comentario chuidiang, explicare un poco mas el problema para que me ayudes a descartar posibilidades de error, mira mi aplicacion lee un streaming de un equipo que envia por red los datos de un puerto serial con un pic programado, y este envia una trama cada medio segundo o menos y al principio lo probe mi aplicacion en casa y recibia los datos a la perfeccion, y cuando la fui a instalar en el lugar donde iba a ir, tuve el problema de que la aplicacion se quedaba colgada y no recibia datos, asiq ue por eso agregue el time out entonces no se que me puede estar provocando que no reciba transmision fluida.
  #6 (permalink)  
Antiguo 22/02/2013, 02:03
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Problema con socket en aplicacion cliente

¿Tienes acceso desde casa al socket que transmite los datos del equipo serial con el pic programado?. Si no es así y en casa lo has probado con simulador, quizás el problema sea que no es exactamente lo mismo tu simulador que el equipo real.

Lo de que la aplicación se queda colgada ... ¿quiere decir que no recibe nada y se queda en el readByte o que todo el programa se queda bloqueado? Si se queda en el readByte y te está saltando el timeout, quizás no estés recibiendo nada. Revisa que el address y el port son correctos y que no hay ningún cortafuegos o algo que corte. Desde tu PC puedes intentar ejecutar el comando "telnet address puerto" y deberías ver llegar las tramas, es una forma de ver si el problema está en tu código o viene de fuera.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: programa, sockets
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 10:50.