public static void ServerAttach()
        {
            BinaryFormatter bfrx = new BinaryFormatter();
            //MemoryStream -> o objeto instanciado será utilizado para armazenar o resultado da serialização
            MemoryStream msrx = new MemoryStream();

            byte[] bufferrx;
            while (true)
            {
                while (cliente.Connected)
                {
                    try
                    {
                        if (cliente.Available > 0)                                             //Aguarda até que o cliente envie a mensagem (número de bytes para leitura > 0)
                        {
                            bufferrx = new byte[cliente.Available];                            //Aloca dinamicamente o buffer que receberá os dados
                            stream.Read(bufferrx, 0, cliente.Available);                       //Realiza a leitura do buffer

                            msrx = new MemoryStream(bufferrx);                                 // Instancia um objeto MemoryStream que será utilizado para a deserialização
                            conexao.conexao conexrx = (conexao.conexao)bfrx.Deserialize(msrx); //Deserializa o

                            if (conexrx.updateGUI)
                            {
                                levelGUI      = conexrx.level;
                                valveGUI      = conexrx.stateValveGUI;
                                waitingServer = false;
                            }
                        }
                    }
                    catch { }
                }
            }
        }
        public void sendData(bool clientSet, bool serverSet, bool stateValve, bool stateValveGUI, bool clientGetLevel, bool updategui, double level)
        {
            try
            {
                //Classe definida em MinhaBiblioteca.dll (namespace MinhaBiblioteca)
                conexao.conexao conex = new conexao.conexao(clientSet, serverSet, stateValve, stateValveGUI, clientGetLevel, updategui, level);

                //Binary Formatter -> classe utilizada para serializar (converter para um array de bytes) o objeto
                BinaryFormatter bf = new BinaryFormatter();

                //MemoryStream -> o objeto instanciado será utilizado para armazenar o resultado da serialização
                MemoryStream ms = new MemoryStream();

                //Serialização
                bf.Serialize(ms, conex);
                //MessageBox.Show("serializou");
                //Envio do objeto pela rede
                stream.Write(ms.ToArray(), 0, ms.ToArray().Length);
            }
            catch
            {
                MessageBox.Show("Erro ao comunicar com o servidor");
                this.desconectar();
            }
        }
        //-------------------------------------------------NETWORK-------------------------------------------------------------

        public static void trataClientes(object Objcliente)
        {
            TcpClient     cliente = (TcpClient)Objcliente;
            NetworkStream stream;

            conexao.conexao conex = new conexao.conexao(false, false, false, false, false, false, 0); //Instância da classe conexao, recebe os dados dos clientes e alterações são realizadas simutalneamente
            BinaryFormatter bf    = new BinaryFormatter();                                            //Classe para deserializar

            byte[] buffer;                                                                            //Array de bytes, que será utilizado para receber o stream proveniente da comunicação TCP IP

            bool flag_level = false;

            Console.WriteLine(System.DateTime.Now.ToString() + " - Cliente " + cliente.Client.RemoteEndPoint.ToString() + " Conectado - Atendendo requisições");

            stream = cliente.GetStream();  //Obtém o network stream

            while (cliente.Connected)
            {
                try
                {                                                    //A propriedade Available informa o número de bytes disponíveis para leitura de um determinado cliente
                    if (cliente.Available > 0)                       //Aguarda até que o cliente envie a mensagem (número de bytes para leitura > 0)
                    {
                        buffer = new byte[cliente.Available];        //Aloca dinamicamente o buffer que receberá os dados
                        stream.Read(buffer, 0, cliente.Available);   //Realiza a leitura do buffer

                        MemoryStream ms = new MemoryStream(buffer);  // Instancia um objeto MemoryStream que será utilizado para a deserialização
                        conex = (conexao.conexao)bf.Deserialize(ms); //Deserializa o objeto

                        if (conex.clientSet)
                        {
                            stateValve         = conex.stateValve;
                            intention_setValve = true;
                        }
                        if (conex.clientGetLevel)
                        {
                            flag_level = true;
                        }

                        Console.WriteLine("Cliente: " + cliente.Client.RemoteEndPoint.ToString() + "--> clientSet: " + conex.clientSet.ToString() + " stateValve: " + conex.stateValve + "clientGetLevel: " + conex.clientGetLevel);
                    }

                    if (flag_level)
                    {
                        conex.serverSet     = true;
                        conex.level         = nivel;
                        conex.updateGUI     = true;
                        conex.stateValveGUI = stateValve;

                        //Binary Formatter -> classe utilizada para serializar (converter para um array de bytes) o objeto
                        BinaryFormatter bf2 = new BinaryFormatter();
                        //MemoryStream -> o objeto instanciado será utilizado para armazenar o resultado da serialização
                        MemoryStream ms2 = new MemoryStream();
                        //Serialização
                        bf2.Serialize(ms2, conex);
                        //Envio do objeto pela rede
                        stream.Write(ms2.ToArray(), 0, ms2.ToArray().Length);
                        flag_level = false;
                    }

                    if (timerFlag) // não é a melhor abordagem, mas funciona legal
                    {
                        conex.updateGUI      = true;
                        conex.stateValveGUI  = stateValve;
                        conex.clientGetLevel = false;
                        conex.level          = nivel;
                        //Binary Formatter -> classe utilizada para serializar (converter para um array de bytes) o objeto
                        BinaryFormatter bf2 = new BinaryFormatter();
                        //MemoryStream -> o objeto instanciado será utilizado para armazenar o resultado da serialização
                        MemoryStream ms2 = new MemoryStream();
                        //Serialização
                        bf2.Serialize(ms2, conex);
                        //Envio do objeto pela rede
                        stream.Write(ms2.ToArray(), 0, ms2.ToArray().Length);
                        flag_level = false;
                    }
                }
                catch (SystemException ex)
                {
                    if (cliente.Connected)
                    {
                        Console.WriteLine("Erro: " + ex.Message);
                    }

                    stream.Close();
                    cliente.Close();
                }
            }
            cliente.Close();
            stream.Close();
            Console.WriteLine(System.DateTime.Now.ToString() + " - Cliente Desconectado");
        }