public List <IVectorMessage <T> > GetMissingMessages(int[] compareVetor) { lock (this) { List <IVectorMessage <T> > missingMessages = new List <IVectorMessage <T> >(); for (int index = 0; index < this.vector.Length; index++) { //se no index a versão é inferior if (compareVetor[index] < this.vector[index]) { int receivedVersion = compareVetor[index]; int expectedVersion = this.vector[index]; do { receivedVersion++; IVectorMessage <T> message = this.hashVetorMessages[index + "" + receivedVersion]; missingMessages.Add(message); } while (receivedVersion != expectedVersion); } } return(missingMessages); } }
public void PublishMessage(string username, string message) { //cria a mensagem, dá um tick o clock Message m = new Message(username, message); IVectorMessage <IMessage> vetorMessage = this.vetorClockManager.Tick(m); //todo upadate OnMessageReceived?.Invoke(this.vetorClockManager.GetMessages()); foreach (IClient client in this.Peers) { Task.Run(() => { try { if (client.Username == username) { return; } //envia para cada cliente ((IChat)client).ReceiveMessage(username, vetorMessage); } catch (Exception e) { Console.WriteLine(e.Message); } }); } }
//Remoting public void ReceiveMessage(string username, IVectorMessage <IMessage> message) { this.vetorClockManager.ReceiveMessage(username, message);//quando recebe manda para o vetorclock para ele ver //se existe dependencias //pede a lista e mostra no jogo OnMessageReceived?.Invoke(this.vetorClockManager.GetMessages()); }
//IChatRoom public void ReceiveMessage(string username, IVectorMessage <IMessage> message) { if (CurrentChatRoom == null) { throw new Exception("The session hasn't started."); } CurrentChatRoom.ReceiveMessage(username, message); }
public void ReceiveMessage(IVectorMessage <T> message) { lock (this) { int receivedIndex = message.Index; // o index de quem enviou a mensagem int receivedVersion = message.Vector[receivedIndex]; //o numero do contador de quem enviou a mensagem nesta mensagem List <VectorDependencies> dependencies = new List <VectorDependencies>(); //lista de dependencias para adiconar caso necessario //já recebeu esta mensagem if (this.hashVetorMessages.ContainsKey(receivedIndex + "" + receivedVersion)) { return; } //add to hash table this.hashVetorMessages[receivedIndex + "" + receivedVersion] = message; //vamos verificar se existe dependencias //percorremos todos os campos do vetor que este relogio tem(todos os relogios basicamente) for (int i = 0; i < this.vector.Length; i++) { //se for o mesmo que este não vale apena comparar pois este tem sempre a versão mais recente de ele proprio if (i == this.Index) { continue; } // se a versão for a do recebido if (i == receivedIndex) { int actualReceivedVersion = this.vector[ receivedIndex]; //vamos ver o valor do tick do relogio de quem nos enviou a mensagem //existe versões não recebidas //se a diferença for de 1 então esta tudo bem porque vamos receber a mensagem que nos vai atualizar para a versão mais recente //de quem enviou exemplo [1,2,0] comparado a [1,3,0] sendo quem enviou o index 1 if (receivedVersion - actualReceivedVersion != 1) { //adicionar as versões em falta as dependencias //se não foi temos de adicionar todas as versões anteriores ás dependencias // exemplo [1,2,0] comparado a [1,4,0] sendo quem enviou o index 1 tem dependencia da mensagem 3 do index 1 int aux = actualReceivedVersion; do { aux++; dependencies.Add(new VectorDependencies { Index = receivedIndex, Version = aux }); // adicionar as dependencias } while (receivedVersion - aux != 1); } continue; } //existe mensagens que o que enviou tem e este não logo existe dependencia //o caso as outras dependencias de outros relogios //exemplo [1,2,0] comparado a [1,3,1] sendo quem enviou o index 1 tem dependencia do contador 1 no index 2 if (message.Vector[i] > this.vector[i]) { //a versão atual int aux = this.vector[i]; do { aux++; dependencies.Add(new VectorDependencies { Index = i, Version = aux }); } while (message.Vector[i] != aux); } } //verificar se existem dependencias if (dependencies.Count == 0) { //não existem dependencias logo vamos adicionar a mensagem e dar update no relógio this.vector[receivedIndex] = receivedVersion; // exemplo [1,2,0] => [1,3,0] this.Messages.Add(message); //retirar dependencias desta mensagem this.RemoveDependencie(receivedIndex, receivedVersion); } else { this.waitingVectorMessages[message] = dependencies; } } }
public void ReceiveMessage(string username, IVectorMessage <IMessage> message) { this.vetorClock.ReceiveMessage(message); }