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"); }