Programación General > Java

 Duda con BufferedReader

(1/2) > >>

ropel:
Hola a todos,

tengo una duda con respecto al objeto BufferedReader. Yo tengo una instancia de este objeto por el cual leo datos escritos en un socket determinado, es decir, enviados a través de la red. Cada vez que yo escribo la siguiente línea de código:


--- Código: Text --- String entrada;BufferedReader reader; ........ entrada = reader.readLine();  
La ejecución de mi programa se detiene hasta que lee una línea completa. Mi pregunta es ¿cómo puedo hacer para que mire si se han enviado datos por ese socket y, en caso positivo procesarlos y en caso negativo no permanecer a la espera, sino que me continúe con el programa? Es decir, lo que pretendo es que me continúe la ejecución si no se han escrito datos, pero que los procese en caso positivo, en lugar de que se quede esperando a la llegada de una línea de datos.

Espero haberme explicado adecuadamente. ¿Alguien me puede ayudar u orientar en este aspecto? Espero que lo que pretendo tenga solución.

Muchas gracias y saludos a todos.

dvinchi666:
Analizando un poco. :comp:

lo que unico que se me ocurre es:
    ocupar temporizadores

Arrancas el temporizador justo antes de leer los datos del socket
entonces en otro hilo va aumentando el temporizador hasta cierto valor (timeout) "tiempo de espera maximo para que hayan insertado datos en el socket"

Fragmento de codigo:


--- Código: Text ---//  //  Timer.java//  Copyright (c) 1996, Agustin Froufe//  Todos los derechos reservados.//  //  No se asume ninguna  responsabilidad por el  uso o  alteracion  de este//  software.  Este software se proporciona COMO ES, sin garantia de ningun//  tipo de su funcionamiento y en ningun caso sera el autor responsable de//  daños o perjuicios que se deriven del mal uso del software,  aun cuando//  este haya sido notificado de la posibilidad de dicho daño.// //   Compilador: javac 1.0//        Autor: Agustin Froufe//     Creacion: 23-Oct-1996  014:53:09// //--------------------------------------------------------------------------//  Esta informacion no es necesariamente definitiva y esta sujeta a cambios//  que pueden ser incorporados en cualquier momento, sin avisar.//-------------------------------------------------------------------------- import java.lang.*;import java.util.*; public class Timer implements Runnable {    private Date inicio,parada;    private Thread thread = null;    private int duracion = 0;    private int duracionAnt = 0;    private int intervalo = 1000;    private boolean repeticion = false;    private boolean enEjecucion = false;    private Temporizador handler = null;        // Contructor basico, usado por defecto    Timer() { }         // Los siguientes constructores son de conveniencia, porque todas    // las caracteristicas del timer se pueden ver y modificar a    // traves de los metodos get y set    // Constructor de conveniencia que acepta un tiempo de duracion    Timer( int tiempo ) {         setDuracion( tiempo );         }         // Constructor de conveniencia que acepta un Temporizador    Timer( Temporizador Handler ) {         setHandler( Handler );         }         // Constructor de conveniencia que acepta un temporizador y una    // duracion    Timer( int tiempo,Temporizador Handler ) {        setDuracion( tiempo );        setHandler( Handler );        }          // Fija el numero se segundos que correra el timer    public void setDuracion( int tiempo ) {         duracion = tiempo;         }         // Fija el objeto que ha de ser notificado de los eventos que    // sucedan al timer    public void setHandler( Temporizador Handler ) {         handler = Handler;         }         // Fija el numero de milisegundos entre pulsos del timer    public void setIntervalo( int Intervalo ) {         intervalo = Intervalo;         }         // Funciones "get" para recoger los datos de las caracteristicas    // que se han fijado antes    public int getDuration() {         return( duracion );         }     public Temporizador getHandler() {         return( handler );         }     public int getIntervalo() {         return( intervalo );         }            // Devuelve el numero de segundos que han transcurrido desde que    // se arranco el timer    public int getElapsed() {         return( calculaLapso( new Date() ) );         }         // Este metodo permite resetear el timer antes de relanzarlo. Se    // podria usar el metodo setDuracion, pero este es mas corto    // y elegante    public void resetDuracion() {         duracion = duracionAnt;         }               // Aqui creamos un nuevo thread para correr el Timer. Lo incializamos    // con "this" de forma que el metodo run() se llame inmediatamente    // como comience la ejecucion del thread    public void start() {        thread = new Thread( this );        thread.start();        }      // Aqui almacenamos el momento en que se llama a este metodo.    // Tambien comprobamos si hay algun Temporizador asociado al Timer    // que estamos parando, en cuyo caso, notificamos a los observadores    // de este Timer que lo hemos detenido (para eso esta la interface    // Temporizador, que debera estar implementada en las clases que    // miren a este Timer)    public void stop() {        enEjecucion = false;        parada = new Date();        if ( handler != null )            handler.timerParado( this );        }         public void run() {        enEjecucion = true;        duracionAnt = duracion;         // Arrancamos el Timer y lo notificamos a las clases que esten        // poendientes        inicio = new Date();        if( handler != null )            handler.timerArrancado( this );         while( enEjecucion )            {            // Esperamos el tiempo que nos hayan dicho en la configuracion            // del intervalo            try {                esperar( intervalo );            } catch( InterruptedException e ) {                return;                }                         // Cuando se cumple el intervalo, avisamos a las clases que            // esten pendientes. Si esas clases no quieren hacer nada            // con este evento periodico, es suficiente con que no lo            // sobrecarguen, que se quede vacio            if( handler != null )                handler.timerIntervalo( this );                         // Si no indicamos una duracion para el Timer, estara            // corriendo indefinidamente            if( duracion > 0 )                {                // Comprobamos si el Timer esta muerto ya, para no                // tener que matarlo                if( estaMuerto() )                    {                    // Si esta muerto, lo propagamos                    if( handler != null )                        handler.timerMuerto( this );                                                   // Aqui comprobamos si se quiere una repeticion                    // automatica, en cuyo caso, volvemos a arrancar                    // el Timer                    if( repeticion )                        {                        enEjecucion = true;                        inicio = new Date();                        if( handler != null )                            handler.timerArrancado( this );                           }                    else                        {                        enEjecucion = false;                        }                    }                }            }        }            // Metodos que nos informan del estado del Timer    public boolean estaCorriendo() {         return( enEjecucion );         }        public boolean estaParado() {         return( !enEjecucion );         }         public boolean estaMuerto() {        int segundos = 0;         // Calculamos el intervalo de tiempo que ha transcurrido desde        // que se ha arrancado el Timer        segundos = calculaLapso( new Date() );         if( segundos >= duracion )             return( true );        else            return( false );        }               private int calculaLapso( Date actual ) {        Date dfinal;        int  segundos = 0;         if( enEjecucion )            dfinal = actual;        else            dfinal = parada;         // Si se quiere mas precision, en vez de Date(), se puede        // utilizar System.currentTimeMillis(), que proporciona        // muchisima mas resolucion        segundos += ( dfinal.getHours() - inicio.getHours() ) * 3600;        segundos += ( dfinal.getMinutes() - inicio.getMinutes() ) * 60;        segundos += ( dfinal.getSeconds() - inicio.getSeconds() );        return( segundos );        }         // Aqui implementamos la espera. El lapso en milisegundos se lo    // pasamos al metodo wait() del thread    // Este metodo es sincronizado porque sino salta una excepcion     // interna en el interprete de Java. No esta muy bien documentado    // el porque, pero parece ser que no se puede llamar al metodo    // wait() de un thread desde otro que no sea sincronizado    private synchronized void esperar( int lapso )         throws InterruptedException {        this.wait( lapso );        }       }   //--------------------------------------------- Final del fichero Timer.java     

--- Código: Text ---//  //  Temporizador.java//  Copyright (c) 1996, Agustin Froufe//  Todos los derechos reservados.//  //  No se asume ninguna  responsabilidad por el  uso o  alteracion  de este//  software.  Este software se proporciona COMO ES, sin garantia de ningun//  tipo de su funcionamiento y en ningun caso sera el autor responsable de//  daños o perjuicios que se deriven del mal uso del software,  aun cuando//  este haya sido notificado de la posibilidad de dicho daño.// //   Compilador: javac 1.0//        Autor: Agustin Froufe//     Creacion: 23-Oct-1996  13:56:30// //--------------------------------------------------------------------------//  Esta informacion no es necesariamente definitiva y esta sujeta a cambios//  que pueden ser incorporados en cualquier momento, sin avisar.//--------------------------------------------------------------------------  // // Interface que vamos a utilizar en la implementacion del timer, con el// que luego generaremos el reloj digital de demostracion// Esta interface debe ser implementada por cualquier clase que desee// ser informada de los eventos que genere el Timer, en nuetro caso el// reloj//public interface Temporizador {    public void timerArrancado( Timer timer );       public void timerParado( Timer timer );       public void timerMuerto( Timer timer );    public void timerIntervalo( Timer timer );    } //------------------------------------- Final del fichero Temporizador.java  
La idea general es que cuando pase cierto tiempo otro programa(temporizador) (trhead  == hilo ) le envie una señal al
programa principal (donde se estan leyendo los datos ) para que prosiga la ejecucion del mismo y que procese lo que se leyo del socket.
OK

 :alien:

m0skit0:

--- Cita de: "ropel" ---¿cómo puedo hacer para que mire si se han enviado datos por ese socket y, en caso positivo procesarlos y en caso negativo no permanecer a la espera, sino que me continúe con el programa?
--- Fin de la cita ---
Tengo una duda con tu problema: ¿debe esperar tiempo a por los datos? ¿cuánto tiempo debe estar esperando? ¿o debe seguir y cuando se introduzcan los datos capturarlos, sea cual sea el momento?

ropel:
Hola a todos,

Gracias a los dos por contestar mi pregunta. Os comento un poco más y a ver si os puedo resolver las dudas que tenéis.

Yo en principio, no quiero que el programa espere para la recepción de datos, es decir, solamente quiero comprobar en un instante determinado de tiempo si se han enviado datos en un socket. Si la comprobación resulta que no se han recibido datos en el socket correspondiente, el programa siga, pero actualmente, tal y como lo tengo implementado, se queda bloqueado en la llamada a:


--- Código: Text ---reader.readLine(); 
Mi idea es que compruebe si tengo datos en el socket. Si es así, los recogo, en caso contrario, sigo con el programa. ¿Me entendéis ahora mejor? Espero haberme explicado ahora mejor que en el post anterior.

¿Alguna idea o solución? De todas maneras, muchas gracias de antemano.

m0skit0:
¿El BufferedReader no te oferece ningún método para comprobar si hay datos, sin leerlos?

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa