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

Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (thread)

Estas en el tema de Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (thread) en el foro de Java en Foros del Web. Hola al foro! En la parte final de mi programa con sockets y threads, he tenido un último problema que no había detectado... Ya pude ...
  #1 (permalink)  
Antiguo 05/07/2011, 16:28
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 12 años, 11 meses
Puntos: 2
Pregunta Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (thread)

Hola al foro!

En la parte final de mi programa con sockets y threads, he tenido un último problema que no había detectado... Ya pude hacer funcionar el hilo y el while que me leen la informacion del socket y todo funciona una maravilla, sin embargo ahora el problema consiste es en detener el hilo correctamente, o mejor dicho no tanto el hilo, sino CANCELAR la lectura de datos del socket, que se queda esperando nuevos datos dentro del while, pero como el socket se cierra, entonces se dispara un error y la aplicación se cierra... Intenté quitar el error poniendo el el catch un return y ya no sale el error pero la aplicación se sigue cerrando, y el DataInputStream queda inhábil para trabajar en una próxima conexión... este es mi código, por si alguien puede ayudarme.

static boolean Flag = true;
Thread SocketThread = new Thread()
{
public void run()
{
while(Flag == true)
{
byte IncomingArray[] = new byte[200];
try
{
Conexion.InputMEssage.read(IncomingArray); //se lee el flujo de entrada del socket y se almacena en un array
}
catch(Exception e)
{
if (Flag == false)
{//Evita que se produzca una excepcion o error si InputMEssage no puede leer del socket
Conexion.InputMEssage = null;
return;
}
e.printStackTrace();
}
String StringArray = new String(IncomingArray);
Ventana.InputMSG = StringArray;
//se envia la informacion a ser procesada en una funcion
Ventana.InputMSG = ProcessPackets.ProcessPacket(Ventana.InputMSG);
if (!Ventana.InputMSG.equals(""))
{//se envia la informacion procesada al campo de texto que almacena el chat
Ventana.txtChat.setText(Ventana.txtChat.getText() + "\n" + Ventana.InputMSG);
Ventana.txtChat.setSelectionStart(Ventana.txtChat. getText().length());
Ventana.InputMSG = "";
}
}
}

Como ven, ahí puse un flag para controlar la ejecución del thread, sin embargo el codigo se queda en espera es en Conexion.InputMEssage.read(IncomingArray); por lo tanto siempre alcanza a ejecutarse 1 vez de forma incorrecta y dispararme el error y cerrarme la ventana... Gracias por la ayuda!
  #2 (permalink)  
Antiguo 05/07/2011, 17:45
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Prueba con esto, no he leido todo tu mensaje pero por el titulo tal vez necesitas esto.

Saludos.

Código java:
Ver original
  1. SocketThread.stop(); //Para detener
  2. SocketThread.start();// para iniciar
  3. SocketThread.suspend()// Para pausar.
  4. SocketThread.resume();// PAra continuar (despues del pause)

Si alguien sabe sobre estos métodos el porque estan mal empleados y nos aclare bien el porque no es bueno utilizarlos aunque aparentemente funcione.

Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #3 (permalink)  
Antiguo 05/07/2011, 18:12
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Cita:
Iniciado por New Ver Mensaje
Prueba con esto, no he leido todo tu mensaje pero por el titulo tal vez necesitas esto.

Saludos.

Código java:
Ver original
  1. SocketThread.stop(); //Para detener
  2. SocketThread.start();// para iniciar
  3. SocketThread.suspend()// Para pausar.
  4. SocketThread.resume();// PAra continuar (despues del pause)

Si alguien sabe sobre estos métodos el porque estan mal empleados y nos aclare bien el porque no es bueno utilizarlos aunque aparentemente funcione.

Saludos.
Gracias por responder! Pero el problema no es detener el hilo, sino el estado de "esperando datos para leer", el hilo se detiene correctamente, pero no logro cancelar la lectura programada por parte de InputMEssage.
  #4 (permalink)  
Antiguo 05/07/2011, 18:23
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Cita:
Iniciado por New Ver Mensaje
Prueba con esto, no he leido todo tu mensaje pero por el titulo tal vez necesitas esto.

Saludos.

Código java:
Ver original
  1. SocketThread.stop(); //Para detener
  2. SocketThread.start();// para iniciar
  3. SocketThread.suspend()// Para pausar.
  4. SocketThread.resume();// PAra continuar (despues del pause)

Si alguien sabe sobre estos métodos el porque estan mal empleados y nos aclare bien el porque no es bueno utilizarlos aunque aparentemente funcione.

Saludos.
Ah y se me olvidaba contestarte. NO todos están en desuso, sólo el de stop(). Esto se debe a que aparentemente los desarrolladores de Java lo consideran muy obsoleto y muy inseguro, es decir un riesgo usarlo. Los demás si funcionan.
  #5 (permalink)  
Antiguo 06/07/2011, 02:05
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Hola:

No acabo de entender el problema. Entiendo que quieres detener la lectura ... ¿porque alguien cierra el socket al otro lado?

Si cierran el socket al otro lado te salta una excepción y la capturas con un catch.
Si tú interrumpes la lectura de alguna forma (no estoy seguro si se puede hacer en java), te saltará también una excepción que capturas con un catch.
Si en el socket usas setSoTimeout(), la lectura terminará en el tiempo establecido si no hay datos, pero lanzará una excepción que tienes que capturar con catch.

Es decir, de la excepción no te libra nadie. Con una excepción capturada el programa no se cierra, así que si estás capturando la excepción y se te cierra el programa, posiblemente es porque después de la excepción tu programa no haga nada (si el main lanza esta hilo y no hace mas, cuando este hilo termine, termina el programa).

Si el socket se cierra en el otro lado, el socket que tú tienes ya no vale. No te queda más remedio que volver a intentar establecer la conexión con otro socket nuevo y otro DataInputStream nuevo y posiblemente lanzar un hilo nuevo. Y ese es el código que debe hacer tu programa cuando capturas la excepción para evitar que se cierre.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #6 (permalink)  
Antiguo 06/07/2011, 09:50
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Gracias Ferkhis.

chuidiang tiene razon.

Cuentanos que excepciones te salen al hacer que.

tratalas con un

Código java:
Ver original
  1. try{
  2.  
  3. .
  4. .
  5. .
  6.  
  7. }catch(Exception e){ System.out.println("La excepcion es: "+e); }


Para saber que tipo de excepcion ocurre.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #7 (permalink)  
Antiguo 06/07/2011, 14:40
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 12 años, 11 meses
Puntos: 2
Pregunta Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

No acabo de entender el problema. Entiendo que quieres detener la lectura ... ¿porque alguien cierra el socket al otro lado?

Si cierran el socket al otro lado te salta una excepción y la capturas con un catch.
Si tú interrumpes la lectura de alguna forma (no estoy seguro si se puede hacer en java), te saltará también una excepción que capturas con un catch.
Si en el socket usas setSoTimeout(), la lectura terminará en el tiempo establecido si no hay datos, pero lanzará una excepción que tienes que capturar con catch.

Es decir, de la excepción no te libra nadie. Con una excepción capturada el programa no se cierra, así que si estás capturando la excepción y se te cierra el programa, posiblemente es porque después de la excepción tu programa no haga nada (si el main lanza esta hilo y no hace mas, cuando este hilo termine, termina el programa).

Si el socket se cierra en el otro lado, el socket que tú tienes ya no vale. No te queda más remedio que volver a intentar establecer la conexión con otro socket nuevo y otro DataInputStream nuevo y posiblemente lanzar un hilo nuevo. Y ese es el código que debe hacer tu programa cuando capturas la excepción para evitar que se cierre.

Se bueno.
Hey Chudiang gracias por contestar!

Ya vi porque el programa se me cierra sólo, yo en los catch tenia System.exit(1); pero no lo recordaba ya que llevo varios días en este programa. Pero yo lo arreglé y todo bien. Sin embargo si desconecto mi aplicación y la quiero conectar de nuevo, para la ultima vez que la cerré mi DataInputStream (InputMEssage) ya está en un "estado de error"... qué puedo hacer para reinicializarlo y sacaro de ahí, para que siga funcionando normalmente?
  #8 (permalink)  
Antiguo 06/07/2011, 14:42
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 12 años, 11 meses
Puntos: 2
Pregunta Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Cita:
Iniciado por New Ver Mensaje
Gracias Ferkhis.

chuidiang tiene razon.

Cuentanos que excepciones te salen al hacer que.

tratalas con un

Código java:
Ver original
  1. try{
  2.  
  3. .
  4. .
  5. .
  6.  
  7. }catch(Exception e){ System.out.println("La excepcion es: "+e); }


Para saber que tipo de excepcion ocurre.
Hey New gracias por contestar!

Ya vi porque el programa se me cierra sólo, yo en los catch tenia System.exit(1); pero no lo recordaba ya que llevo varios días en este programa. Pero yo lo arreglé y todo bien. Sin embargo si desconecto mi aplicación y la quiero conectar de nuevo, para la ultima vez que la cerré mi DataInputStream (InputMEssage) ya está en un "estado de error"... qué puedo hacer para reinicializarlo y sacaro de ahí, para que siga funcionando normalmente?

La excepción es socket closed... y evidentemente es porque el socket se cierra y el InputMEssage esta leyendo datos de un socket cerrado... entonces se puede sacar el objeto del estado de error para nueva conexion?
  #9 (permalink)  
Antiguo 07/07/2011, 06:05
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Cómo Cancelar lectura de DataInputStream en un while dentro de un Hilo (th

Como te comenté antes, no se puede "reiniciarlizar" un socket, inputstream, datainputstream, etc que ya esté cerrado. Lo único que puedes hacer es empezar la conexión de cero, haciendo otra vez todos los news, empezando por el Socket (si es Socket cliente) o con un nuevo accept(), si es SocketServidor.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: datainputstream, socket, threads
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 04:07.