elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Pequeña ayuda con algoritmo de sincronización de relojes (receive, send)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pequeña ayuda con algoritmo de sincronización de relojes (receive, send)  (Leído 5,209 veces)
murdoc_87_1

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Pequeña ayuda con algoritmo de sincronización de relojes (receive, send)
« en: 16 Mayo 2010, 17:57 pm »

Hola que tal, tengo la siguiente duda: cómo logro que un contador que tengo, siga "corriendo" o que no se detenga por un receive, pero tal receive debe estar al pendiente por si el servidor (servidor activo, puesto que envía datos a todos sus clientes, pues estoy haciendo el algoritmo de berkeley de sincronización de relojes) le envía un dato que, en este caso, es el tiempo que actual que tiene el cronómetro.
Código:
public class Client extends Thread
{
private boolean vivo;
private ClientGUI clienteGUI;
int puerto = 3000;
        byte[] buffer = new byte[10];
        DatagramPacket dato = new DatagramPacket(buffer, buffer.length);// Un DatagramPacket para recibir los mensajes.
//
private int h_p;
private long tiempoinicial;

private float d2p;
private int tiempointerrupcion;
private int n;
private int tipo;
public Client(ClientGUI cliente, MicroKernel nucleo, int id,long tiempoinicial,int h,int d,float p,int tipoReloj)
{
this.clienteGUI = cliente;
this.nucleo = nucleo;
this.id = id;
this.tipo=tipoReloj;

vivo = true;
if(tipoReloj==1){
    h_p=h;
    }
    else if(tipoReloj ==2){
    h_p=h-(int)(h*p);
    }
    else if (tipoReloj == 3){
    h_p=h+(int)(h*p);
    }
    n=1000/h;
    d2p=d/(2*p);
    this.tiempoinicial=tiempoinicial;
    tiempointerrupcion = 1000/h_p;
       
start();
}
public void stopThread()
{
vivo = false;
}
public void setInicio(int hi) {
        tiempoinicial = hi;
    }

         public synchronized void receive()
{
             try{

    InetAddress direccion = InetAddress.getLocalHost();// direccion ip del interfaz de red
                DatagramSocket socket = new DatagramSocket(puerto, direccion); // Se recibe un dato y se escribe en pantalla.
                socket.setBroadcast(true);
                socket.receive(dato);
                socket.disconnect();
                clienteGUI.printMessage("Recibido dato de "+ dato.getAddress().getHostName() + " : ");
                // Conversion de los bytes a String
                String msg = new String(dato.getData());
                clienteGUI.printMessage(msg);

                socket.close();
    }catch (Exception e) {e.printStackTrace();}
         }

public void run()
{
while(vivo){
    try{
   
    sleep(tiempointerrupcion);
    tiempoinicial += n;
                clienteGUI.tiempoActual(String.valueOf(tiempoinicial));
                receive();
    }catch (InterruptedException e ){e.getMessage();}
                 catch (Exception e) {e.printStackTrace();}
    }
   
   
    }
}
Este código actual lo que hace es cada incremento sucede por cada receive que se recibe, lo que quiero es que el contador siga de corrido, es decir, los incrementos no se detengan por el receive, pero el receive esté al pendiente y despliegue el mensaje recibido. Espero haberme explicado, saludos


En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: Pequeña ayuda con algoritmo de sincronización de relojes (receive, send)
« Respuesta #1 en: 17 Mayo 2010, 19:53 pm »

Te refieres a que el receive del datagram sea en modo no bloqueante? creo que puedes usando DatagramChannel en vez del receive del socket
pon channel.configureBlocking(false) y échale un vistazo a este código http://www.java2s.com/Tutorial/Java/0320__Network/SetupDatagramChannel.htm


En línea

murdoc_87_1

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Pequeña ayuda con algoritmo de sincronización de relojes (receive, send)
« Respuesta #2 en: 25 Mayo 2010, 20:14 pm »

gracias por la respuesta biribau pero era otro problema, un error más humano: mezclar datos de otra clase en otra. Me explico: debería haber creado una clase cronómetro y en otra clase hacer los send y receive para que no se trabara, es decir tener 2 hilos. Así pude solucionarlo, gracias
En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.647


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Pequeña ayuda con algoritmo de sincronización de relojes (receive, send)
« Respuesta #3 en: 25 Mayo 2010, 22:18 pm »

Yo creo que es mejor utilizar un mienbro Thread, que heredar de Thread, no se , es mi opinión..

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Vuelve el horario de invierno:los relojes se retrasan una hora en la madrugada..
Foro Libre
wolfbcn 5 1,482 Último mensaje 30 Octubre 2012, 02:27 am
por Binary_Death
TomTom también quiere relojes
Noticias
wolfbcn 0 852 Último mensaje 18 Abril 2013, 22:37 pm
por wolfbcn
Ayuda con sincronización de procesos para MITM en C++
Programación C/C++
Kaxperday 3 1,506 Último mensaje 15 Julio 2015, 19:41 pm
por x64core
Sincronizacion y cierre [AYUDA]
Redes
bash 0 938 Último mensaje 15 Mayo 2016, 15:28 pm
por bash
Problema Sincronizacion de relojes
Windows
Kuora 1 554 Último mensaje 19 Diciembre 2018, 13:41 pm
por Machacador
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines