コード例 #1
0
 public Resposta ProcessaComando(Requisicao req)
 {
     while (true)
     {
         lock (blockRespostasGRPC)
         {
             if (listaRespostasGRPC.ContainsKey(req))
             {
                 Resposta r = new Resposta();
                 string   rep;
                 listaRespostasGRPC.TryGetValue(req, out rep);
                 r.Mensagem = rep;
                 listaRespostasGRPC.Remove(req);
                 return(r);
             }
         }
     }
 }
コード例 #2
0
ファイル: Program.cs プロジェクト: ArthurFR/UDP-Client-Server
        /// <summary>
        /// Thread que pega os comandos de filaProcessa os processa e envia o resultado para o cliente.
        /// </summary>
        static void ThreadProcessaComando()
        {
            Requisicao req;
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), portaEnvia);

            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            socket.Bind(ip);

            while (true)
            {
                lock (blockProcessa)
                {
                    if (filaProcessa.Count > 0)
                    {
                        req = filaProcessa.Dequeue();
                        string resposta = "";
                        byte[] resp;
                        if (req.Comand.comand != (int)Comandos.LISTAR && req.Comand.comand != (int)Comandos.MONITORAR)
                        {
                            ProcessaComando(req.Comand, ref resposta);
                            if (req.Remote != null)
                            {
                                resp = Encoding.UTF8.GetBytes(resposta);
                                socket.SendTo(resp, resposta.Length, SocketFlags.None, req.Remote);
                            }
                            else
                            {
                                lock (blockRespostasGRPC)
                                {
                                    listaRespostasGRPC.Add(req, resposta);
                                }
                            }
                        }
                        else if (req.Comand.comand == (int)Comandos.LISTAR)
                        {
                            if (req.Remote != null)
                            {
                                foreach (KeyValuePair <long, string> entry in Mapa)
                                {
                                    resposta = entry.Key + " - " + entry.Value;
                                    resp     = Encoding.UTF8.GetBytes(resposta);
                                    socket.SendTo(resp, resposta.Length, SocketFlags.None, req.Remote);
                                }
                            }
                            else
                            {
                                foreach (KeyValuePair <long, string> entry in Mapa)
                                {
                                    resposta = entry.Key + " - " + entry.Value;
                                    lock (req.block)
                                    {
                                        req.respostas.Enqueue(resposta);
                                    }
                                }
                                lock (req.block)
                                {
                                    req.HaRespostas = false;
                                }
                            }
                        }
                        else if (req.Comand.comand == (int)Comandos.MONITORAR)
                        {
                            Requisicao existe = null;
                            if (!Mapa.ContainsKey(req.Comand.Chave))
                            {
                                lock (req.block)
                                {
                                    req.respostas.Enqueue("Chave inexistente.");
                                    req.HaRespostas = false;
                                    continue;
                                }
                            }
                            foreach (Requisicao r in Monitorados)
                            {
                                if (r.EstaMonitorando(req.Comand.Chave) && r.context.Peer == req.context.Peer)
                                {
                                    existe = r;
                                }
                            }
                            if (existe != null)
                            {
                                lock (req.block){
                                    lock (Monitorados)
                                    {
                                        Monitorados.Remove(existe);
                                    }

                                    lock (existe.block)
                                    {
                                        existe.HaRespostas = false;
                                    }
                                    req.respostas.Enqueue("Monitoramento da chave " + req.Comand.Chave + " parado com sucesso.");
                                    req.HaRespostas = false;
                                }
                            }
                            else
                            {
                                req.monitora = req.Comand.Chave;
                                lock (Monitorados)
                                {
                                    Monitorados.Add(req);
                                }

                                lock (req.block)
                                {
                                    req.respostas.Enqueue("Monitoramento da chave " + req.Comand.Chave + " iniciado com sucesso.");
                                }
                            }
                        }

                        List <Requisicao> remover = new List <Requisicao>();
                        lock (Monitorados)
                        {
                            foreach (Requisicao r in Monitorados)
                            {
                                if (req.Comand.Chave == r.monitora)
                                {
                                    lock (r.block)
                                    {
                                        if (req.Comand.comand == (int)Comandos.UPDATE)
                                        {
                                            r.respostas.Enqueue("Valor da chave " + r.Comand.Chave + " atualizado.\nNovo valor: " + req.Comand.Valor);
                                        }
                                        else if (req.Comand.comand == (int)Comandos.DELETE)
                                        {
                                            remover.Add(r);
                                            r.respostas.Enqueue("Chave " + r.Comand.Chave + " deletada.\nParando monitoramento.");
                                            r.HaRespostas = false;
                                        }
                                    }
                                }
                            }
                        }
                        lock (Monitorados)
                        {
                            foreach (Requisicao r in remover)
                            {
                                Monitorados.Remove(r);
                            }
                        }
                    }
                }
            }
        }