Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 de 5 Comunicação pela rede através de socket Cristiano Soares Drescher c.drescher@hotmail.com Universidade do Vale do Rio dos Sinos. Avenida Unisinos, 950 - 93352-000, São Leopoldo, RS, Brasil Resumo – Atualmente existem algumas tecnologias que permitem a comunicação entre máquinas. Uma das tecnologias/mecanismos mais comuns para comunicação entre máquinas é os sockets. Socket é um mecanismo de comunicação, usado normalmente para implementar um modelo cliente/servidor, que permite a troca de mensagens entre os processos de uma máquina/aplicação servidor e de uma máquina/aplicação cliente. Este resumo nos mostra como esta comunicação é feita. I. INTRODUÇÃO Com o acelerado crescimento da tecnologia, as pessoas e principalmente as empresas, vêm buscando o desenvolvimento de redes de computadores com comunicação cada vez mais rápida e eficaz. De acordo com Stallings (2005), houve uma queda no custo de equipamentos de processamento de dados e aumento de sua capacidade. Por isso hoje é muito comum o uso de computadores de pequeno porte ligados em redes e não a utilização de computadores de grande porte como mainframes. Segundo Correia (2008), o mecanismo que oferece capacidade para troca de informações em rede mais utilizado atualmente é chamado socket. Um socket define um mecanismo de troca de dados entre dois ou mais processos distintos, processos estes que podem estar em execução na mesma máquina ou em máquinas diferentes, porém ligadas em rede. Uma vez estabelecida à ligação entre dois processos através dos socket, podem ser enviados dados em ambos os sentidos até que um dos pontos termine a ligação. A implementação de um socket pode ser feito a partir de várias linguagens de programação. assunto, as áreas de controvérsias (caso existam), a natureza e a extensão da contribuição pretendida. II. REFERENCIAL TEÓRICO A conexão por sockets tem origem em 1980, quando a ARPA (Advanced Research Projects Agency, Agência de Projetos de Pesquisa Avançados), órgão do governo norte americano, forneceu recursos financeiros para que a Universidade da Califórnia em Berkeley II Simpósio de Excelência em Gestão e Tecnologia – SEGeT'2005 1059 oferecesse uma implementação UNIX do pacote de protocolos TCP/IP. Sockets são estruturas que habilitam que dois ou mais aplicativos do tipo cliente / servidor que estão em rede, se conectem entre si (Franco; Silva, 2009). O termo sockets é bastante genérico, e é normalmente usado para designar um conjunto de primitivas que permitem que o programador tenha acesso aos serviços da camada de transporte de uma rede. A. Redes de computadores As redes de computadores surgiram da necessidade de troca de informações e podem ser explicadas como sendo o conjunto de dois ou mais computadores interligados por meios eletrônicos e físicos, no intuito de trocarem informações de forma rápida e fácil, fornecendo aos utilizadores um campo mais vasto de atuação com compartilhamento de equipamentos, de recursos e de gerenciamento, tais como aplicações, ferramentas de comunicação, bases de dados, entre outras. (Franco; Silva, 2009). B. Cliente e Servidor O paradigma de programação distribuída através da separação das aplicações entre servidores e clientes foi à arquitetura de distribuição predominante nos anos 90. Com 2 de 5 este padrão de programação é acrescentada uma maior confiança ao sistema, pois a falha de uma máquina não compromete a operação do sistema como um todo e gera uma redução de custos, pois as máquinas clientes não precisam ser tão robustas, porque todo processamento é feito no servidor. (Franco; Silva, 2009). C. Sockets Segundo Macoratti (2004) socket pode ser entendido como uma porta de um canal de comunicação que permite a um processo executando em um computador enviar ou receber mensagens para ou de outro processo que pode estar sendo executado no mesmo computador ou num computador remoto. Para que exista comunicação em rede, faz-se necessário o uso de um protocolo de comunicação. Um protocolo funciona como linguagem entre computadores em rede e para validar esta comunicação, é preciso que os computadores utilizem o mesmo protocolo. Existem diversos tipos de protocolos. As aplicações de sockets são feitas baseadas no protocolo TCP/IP. O socket representa um ponto de conexão para uma rede TCP / IP, muito semelhante aos soquetes elétricos encontrados em casas, que fornecem um ponto de conexão para os aparelhos eletrodomésticos. Quando dois computadores querem manter uma conversação, cada um deles utiliza um socket. Um computador é chamado servidor (ele abre um socket e presta atenção às conexões), o outro computador denomina-se cliente (ele chama o socketservidor para iniciar a conexão). (Franco; Silva, 2009). D. TCP/IP e porta de comunicação Para que efetivamente ocorra a comunicação entre máquinas mediante a pilha de protocolos TCP/IP o endereço IP é fundamental, porém outros dois fatores são essenciais e precisam ser definidos: o protocolo de transporte e a porta de comunicação. A esta tríade chamamos de socket, cuja função é identificar univocamente uma aplicação na rede. De fato, o sistema operacional associa o socket a um ou mais processos existentes na memória e o utiliza como canal para envio e recebimento dos dados relacionados pela rede. (Ariede, 2009). A porta de comunicação corresponde a um valor inteiro de 16 bits que serve para identificar aplicações, em um computador, que utilizam serviços de conexão. As portas de 1 a 1023 são chamadas de números de portas well known e são reservados para os serviços padrões da Internet. Portas de 1024 a 5000 são denominadas portas efêmeros e são geralmente usados por clientes. Eles têm existência curta porque existem somente durante o período de tempo em que o serviço associado está em uso. Portas acima de 5000 são destinadas a servidores que não estão conectados à Internet. As portas de 1024 a 63535 estão livres para uso das aplicações do usuário. (Seixas, 2009). E. Não Orientada a conexão Neste tipo de troca de dados UDP ou Datagrama, não é estabelecida uma conexão entre a aplicação cliente e a servidora. A aplicação servidora estabelece uma porta que estará disponível para que qualquer cliente possa enviar dados. A comunicação é unidirecional e não há garantias de que os dados realmente chegarão. Abaixo temos a Figura 2 que representa a comunicação de sockets e a pilha TCP/IP, diferenciadas pelos tipos de serviço de transporte: o Datagrama - transporte não orientado a conexão e sem controle de erros (protocolo UDP) e o DataStream - transporte orientado a conexão com controle de erros ( protocolo TCP ). F. Comunicação entre sockets A comunicação entre os sockets TCP/IP acontece da seguinte forma: o servidor escolhe uma porta e aguarda conexões a essa porta, o cliente deve informar o endereço do servidor e a porta usada pelo servidor. Com essa informação o cliente solicita uma conexão ao servidor (Figura 3). Se após o pedido de conexão não ocorrer nenhum problema, o servidor aceita a conexão gerando um socket numa porta do servidor, o que vai criar um canal de comunicação entre o cliente e o servidor. 3 de 5 III – O SISTEMA Programas baseados em sockets são geralmente aplicações cliente-servidor. O servidor espera pedidos de seus clientes, os processa e retorna os resultados ao cliente. O cliente estabelece uma conexão com o servidor, conectando- se a uma porta do servidor na máquina onde o servidor está sendo executado. É preciso saber qual o número da porta de uma aplicação antes de se iniciar um processo de conexão. O sistema desenvolvido é um programa que constitui um exemplo de aplicação cliente/servidor para envio de mensagens na linguagem C#. A – O Sistema Cliente a) Criaum socket e atribui um endereço a ele; b) Solicita a conexão do seu socket ao socket do servidor (conhece o endereço) c) Aguarda que a conexão seja estabelecida; d) Envia uma mensagem; e) Recebe a mensagem de resposta; f) Fecha a conexão com o servidor. O primeiro passo da aplicação cliente é a criação do socket, a linha de código seguinte mostra como é feita essa criação: m_socListener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,Pro tocolType.Tcp); AddressFamily: Endereço da família que vamos utilizar, neste caso interNetwork que é o IP Versão 4. SocketType : O SocketType é o tipo de socket. Podemos usar sockets orientados à Conexão (stream) ou podemos utilizar conexões menos seguras no sentido de não serem orientadas à conexão (datagrams). ProtocolType: Como estamos a utilizar TCP/IP, definimos o protocolo como sendo TCP. Depois da criação do socket, a conexão com servidor é estabelecida, para isso precisamos de duas informações: Endereço IP e Porta de Conexão. public IPEndPoint(System.Net.IPAddress address, int port); No .NET existe uma classe dentro do namespace System.Net, chamada IPEndPoint que nos permite representar um computador como um Endereço Ip e N.º da Porta. O IPEndPoint tem dois construtores: um toma o endereço IP e N.º da Porta, e o outro toma um N.º Long e Nº da Porta. Como temos um endereço IP, vamos usar o 1º construtor. O 1º parâmetro a classe IPAddress, tem um método estático chamado Parse que retorna um IPAddress dando uma String, ao invés de usarmos o IP, usamos o nome do computador, numa rede local. O 2º parâmetro, toma o N.º da Porta. Assim que tivermos um Endpoint, podemos utilizar o método Connect do nosso socket para conectar ao EndPoint (Servidor Remoto). Após feita as definições a conexão é estabelecida, através da linhas de códigos seguinte: System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse("127.0.0.1"); System.Net.IPEndPoint remoteEP = new IPEndPoint (iAdd,8221); m_socClient.Connect (remoteEP); Se o servidor estiver a pronto e tiver respectivo a conexões (listening) a conexão será estabelecida com sucesso. Caso o servidor não esteja a pronto, ou não esteja receptivo a conexões. Caso uma conexão já tenha sido estabelecida e por alguma razão o servidor termina a comunicação. Assumindo que a conexão foi efetuada com sucesso, podemos começar a enviar informação utilizando o método Send do nosso socket. O método Send tem vários overloads, ou por outras palavras, várias formas de interagir com o mesmo. Todos esses overloads tem que tomar um array de bytes. Por exemplo, vamos enviar a mensagem: "Trabalho da disciplina Sistemas Distribuído". try { byte[] buffer = new byte[1024]; int caracterRecebido = m_socClient.Receive(buffer); char[] chars = new char[caracterRecebido]; System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); int charLen = d.GetChars(buffer, 0, caracterRecebido, chars, 0); 4 de 5 System.String DadosRec = new System.String(chars); txtDadosRecebidos.Text = DadosRec; } catch (SocketException se) { MessageBox.Show(se.Message); } O método Send bloqueia o programa até que a string de dados seja enviada, ou um erro seja retornado. Similar ao método Send, é o método Receive na classe do socket. Nós podemos receber dados, usando o seguinte código: byte [] buffer = new byte[1024]; int caracterRecebido = m_socClient.Receive (buffer); Novamente, o programa fica bloqueado, até que o método Receive termine. Isto significa que o programa vai ficar bloqueado até que chegue alguma informação, ou retornado um erro. A Figura 8 representa o sistema cliente na guia dados, onde são enviadas e recebidas as mensagens. B - O SISTEMA SERVIDOR a) Cria um socket e atribui um endereço a ele. Este endereço deve ser conhecido pelo cliente; b) Aguarda a conexão de um cliente; c) Aceita a conexão e cria um novo socket para comunicar com o cliente; d) Recebe a mensagem no novo socket; e) Envia mensagem de resposta; f) Fecha a conexão com o cliente. Quando o cliente faz uma conexão, o servidor precisa aceitar e então para que o servidor emita e receba dados daquele cliente que está conectado precisa de falar a esse cliente através do socket que aceitou a conexão. O código seguinte ilustra como o servidor escuta as conexões e aceita: try { m_socListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 8221); m_socListener.Bind(ipLocal); m_socListener.Listen(4); m_socListener.BeginAccept(new AsyncCallback(OnClientConnect), null); Btn_Escutar.Enabled = false; } catch (SocketException se) { MessageBox.Show(se.Message); } Similar ao cliente é criado um socket de escuta e de liga a um IP address local, é passado da porta: 8221. Em seguida é feita uma chamada para escutar função. Os 4 são um parâmetro que indica a reserva que indica o comprimento máximo da fila de conexões pendentes. Em seguida é feita uma chamada a BeginAccept que passa lhe uma rechamada do delegado. BeginAccept é um método non-blocking que retorne imediatamente e quando um cliente fez pedido uma conexão, a rotina da rechamada é chamado e você pode aceitar a conexão chamando EndAccept. O EndAccept retorna um objeto do socket que represente a conexão entrante. O código seguinte é delegado para a rechamada: try { CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState; int caracterRecebido = 0; caracterRecebido = theSockId.thisSocket.EndReceive(asyn); char[] chars = new char[caracterRecebido + 1]; System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); int charLen = d.GetChars(theSockId.dataBuffer, 0,caracterRecebido, chars, 0); System.String DadosRec = new System.String(chars); txtDadosRecServer.Text = txtDadosRecServer.Text + DadosRec; WaitForData(m_socWorker); } catch (ObjectDisposedException) { 5 de 5 System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket foi fechado\n"); } catch (SocketException se) { MessageBox.Show(se.Message); } } Aqui nós aceitamos a conexão e a chamada WaitForData que chama por sua vez BeginReceive para o m_socWorker. Se nós queremos emitir alguns dados ao cliente nós usamos o socket do m_socWorker para essa finalidade como este: try { Object objDadosEnv = txtDadosEnvServer.Text; byte[] caracter = System.Text.Encoding.ASCII.GetBytes(objDadosEnv.ToStri ng()); m_socWorker.Send(caracter); } catch (SocketException se) { MessageBox.Show(se.Message); } } IV. CONCLUSÃO O mecanismo socket é uma forma simples e eficaz de estabelecer conexões e enviar informações. Através de um socket podemos realizar várias operações: estabelecer conexões entre máquinas, enviar e receber dados, encerrar conexões, esperar por conexões em determinada porta. O socket é um elemento de software que provê uma interface de rede para a aplicação. O sistema desenvolvido mostra, através de uma aplicação simples, o uso do mecanismosocket para envio de mensagens, mas percebe-se que por mais complexa possa ser a aplicação, a forma de comunicação se mantêm a mesma; simples. Comprovando sua importância para o desenvolvimento de aplicações que necessitem de comunicações eficazes e eficientes. V - REFERÊNCIAS ARIEDE, Michel; Sockets: Interney; Disponível em: < http://www.interney.net/intranets/?p=9756482> Acesso em: 18/11/2009 CORREIA, F;Java Socket. Disponível em: Acesso em 18/11/2009 FRANCO, Carla Estefanea de Castro; SILVA, Daniel; Aplicação de Socketes em Java para monitoramento de processos em estações de trabalho; Disponível em: Acesso em: 18/11/2009 MACORATTI, José Carlos; Usando a comunicação Cliente - Servidor com sockets;Disponível em: Acessoem: 18/11/2009 SEIXAS, Constantino; UFMG Departamento de Engenharia Eletrônica - Comunicação através de sockets sobre TCP/IP; Disponível em: Acesso em: 18/11/2009 STALLINGS, W. Redes e sistemas de comunicação de dados: teoria e aplicações corporativas.5. ed. Rio de Janeiro: Campus, 2005. xvi, 449 p. [1] Daiana Aparecida Bueno, Graduanda da Faculdade Cenecista de Varginha – FACECA – daianabueno@yahoo.com.br
Compartilhar