TroiKM / OperativosII

Once life experience. ONCE
1 stars 0 forks source link

Ticks y algoritmo de sincronizacion #3

Closed jmontene closed 10 years ago

jmontene commented 10 years ago

Hacer que los servidores lleven sus tiempos y que se sincronizen al recibir mensajes. Probablemente se requiera un hilo nuevo por servidor que lleve los ticks (o pudiera ser el principal)

LuisMiranda132 commented 10 years ago

Eso no implica hacer una especie de clase especial para los mensajes que lleve la hora en la cual se envió?

jmontene commented 10 years ago

Lo unico que se puede mandar por sockets son packets. Mas bien habria que incluir el tiempo en los mensajes

LuisMiranda132 commented 10 years ago

No he conseguido una forma buena de hacer esto, por lo que veo necesitaríamos que cada mensaje tuviera la hora "virtual" lo cual implica mandar un int o algo asi con el reloj de cada uno para poder usar Lamport.

Por otro lado la forma mas "lógica" (por lo menos para mi) seria mandar objetos Mensajes que tuvieran eso, el detalle esta en que es un peo mandarlos por DatagramPacket http://www.javaworld.com/article/2077539/learn-java/java-tip-40--object-transport-via-datagram-packets.html , hay que hacer que el mensaje sea "serializable" y vainas locas que todavia no entiendo

jmontene commented 10 years ago

Estuve leyendo sobre serializar. Lo que hay que hacer en realidad es simple pero fastidioso. La clase mensaje debe implementar Serializable. Serializable no tiene metodos, asi que no hay que escribir codigo alguno. Eso si, los atributos de la clase deben ser también serializables. Los tipos básicos de java son todos serializables. Lo unico problemático sería incluir un archivo en el mensaje. Lo que se me ocurre es incluirlo como un byte[] en la clase

Una vez que el objeto sea serializable se hace lo siguiente, segun el articulo que mandaste: 1.- Se crea un ByteArrayOutputStream. Esto es para poder hacer streaming de los bytes 2.- Se crea un ObjectOutputStream con el ByteArrayOutputStream para poder escribir el objeto en el ByteArrayOutputStream usando los metodos de ObjectOutputStream 3.- Se escribe con writeObject(objeto) (metodo de ObjectOutputStream) 4.- Se obtiene el array de bytes del ByteArrayOutputStream usando toByteArray() 5.- Se usa ese array para crear el DatagramPacket y mandarlo

Ahora, para recibir hay que hacer lo contratrio: 1.- Recibir el packet por el socket 2.- Hacer un ByteArrayInputStream usando un buffer creado localmente 3.- Hacer un ObjectInputStream usando el ByteArrayInputStream creado antes 4.- Reconstruir el objeto usando el metodo readObject de ObjectInputStream (Hay que castearlo para hacer la conversion bien)

Como se mandan archivos, capaz haya que incrementar el tamño del buffer

jmontene commented 10 years ago

Voy a implementar eso en una issue por separado para poder incluir atributos en los mensajes tambien

jmontene commented 10 years ago

Ya esta implementado. Voy a cerrar la issue que abri y colocar mas o menos como funciona como comentario de cerrado de la issue

LuisMiranda132 commented 10 years ago

(Despues de horas peleando con git...) Voy a comenzar con Lamport a ver que tal

LuisMiranda132 commented 10 years ago

Gente necesito una ayuda un momento, como hago para crear 2 servidores que se manden mensajes entre ellos? :sun_with_face:

jmontene commented 10 years ago

Aun no tenemos implementado lo de la lista de otros servidores que mantiene el servidor (cosa que tampoco tiene issue). Pudieras modificar la clase Servidor para que mandara mas mensajes al inicializar y despues quitas los cambios. Ahorita voy a crear un issue con eso que falta

jmontene commented 10 years ago

De todos modos esta issue es de la segunda milestone, por eso no se tenia eso implementado

jmontene commented 10 years ago

aunque ya la primera milestone esta practicamente lista

jmontene commented 10 years ago

para diferenciar entre dos servidores en la misma maquina, usas dos puertos diferentes

LuisMiranda132 commented 10 years ago

Espera, compilo, corro, cambio puerto, compilo, y corro?

jmontene commented 10 years ago

eso, o lo haces por argumentos, aunque creo que si es mas facil como dices

LuisMiranda132 commented 10 years ago

Ya esta "lista" la parte del tiempo, un servidor cuando entra actualiza su hora y todo.