Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
                    }
                });
            }
        }
Esempio n. 3
0
 //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());
 }
Esempio n. 4
0
        //IChatRoom

        public void ReceiveMessage(string username, IVectorMessage <IMessage> message)
        {
            if (CurrentChatRoom == null)
            {
                throw new Exception("The session hasn't started.");
            }
            CurrentChatRoom.ReceiveMessage(username, message);
        }
Esempio n. 5
0
        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;
                }
            }
        }
Esempio n. 6
0
 public void ReceiveMessage(string username, IVectorMessage <IMessage> message)
 {
     this.vetorClock.ReceiveMessage(message);
 }