Porque este artigo é útil: Sockets permitem realizar uma comunicação entre computadores, no caso do Java, entre máquinas virtuais remotas. Este assunto está presente na maioria dos sistemas operacionais e pode ser implementado por diversas linguagens de programação, possibilitando ao desenvolvedor a comunicação de aplicações que necessitam transmitir/receber dados e, também, desenvolver serviços de rede como servidores web, FTP, SSH ou qualquer outro baseado em redes TCP/IP.

Este artigo aborda conceitos sobre sockets TCP, os quais permitem realizar a comunicação entre máquinas virtuais através de redes de computadores. Para viabilizar essa comunicação, o pacote java.net oferece classes para envio e recebimento de dados. Inseridas neste contexto, as classes Socket e ServerSocket possibilitam realizar uma conexão cliente-servidor para transmitir dados primitivos e objetos por meio das classes DataInputStream/DataOutputStream e ObjectInputStream/ObjectOutputStream, respectivamente. Por fim, este artigo confere ao leitor conhecimentos básicos de como implementar um servidor que aceite múltiplas conexões de clientes.

Um servidor pode ser visto como um computador dedicado a oferecer serviços para outros computadores dentro de uma rede. Estes serviços variam de acordo com a necessidade de uma corporação, partindo de um simples servidor de arquivos (FTP) até outras funcionalidades mais específicas como web, banco de dados, e-mail, proxy, entre outros, nos quais máquinas clientes se conectam e utilizam diversos recursos oferecidos por eles. Usualmente, um serviço é implementado sob um conjunto de regras (protocolo) de envio e recebimento de dados entre o cliente e o servidor, baseando-se em TCP ou UDP.

O TCP (Transmission Control Protocol) e o UDP (User Datagram Protocol) são protocolos relacionados à Camada 4 do Modelo OSI, conhecida como camada de transporte. Atualmente, a maior parte dos computadores conectados em rede acaba utilizando um desses dois protocolos para se comunicar. No entanto, existem algumas peculiaridades a serem consideradas de acordo com a finalidade da transmissão a ser realizada, como garantir a entrega de pacotes de forma ordenada e íntegra.

Apesar de ser necessário compreender as particularidades de cada protocolo, o desenvolvedor Java não precisa se preocupar com a implementação dos protocolos de controle de transmissão de dados, pois o pacote java.net oferece classes que facilitam a comunicação entre computadores. Neste contexto, este artigo aborda os conceitos de comunicação TCP utilizando as classes Socket e ServerSocket a fim de prover a transmissão de dados entre computadores. Para isso, também demonstramos as classes DataInputStream, DataOutputStream, ObjectInputStream e ObjectOutputStream para o envio e recebimento de dados primitivos e objetos.

O protocolo TCP

O TCP é um protocolo orientado à conexão que permite a comunicação entre dois computadores estabelecendo uma conexão (handshaking) antes que qualquer transmissão de dados seja realizada. Dentro desse contexto, cada máquina cliente necessitará estabelecer uma conexão com o servidor, abrindo um canal de comunicação entre os dois computadores conforme apresentado na Figura 1. Assim, é possível conectar vários clientes a um único servidor.

Modelo de Comunicação TCP

Figura 1. Modelo de Comunicação TCP.

O TCP é um protocolo com algumas vantagens em relação ao protocolo UDP. Entre elas estão a garantia de entrega dos pacotes ao destino, o que certifica a integridade, e a garantia da entrega dos pacotes mantendo a ordem original de envio.

Conforme mencionado anteriormente, uma única máquina servidora pode oferecer diversos serviços, e do outro lado, máquinas cliente também podem receber um ou mais serviços. Esse contexto leva à pergunta: como é possível a transmissão de dados de dois ou mais serviços diferentes para um mesmo cliente sem que eles sejam entregues a aplicações erradas?

A resposta está no uso de portas de comunicação, i.e., as aplicações realizam a transmissão de dados por meio de uma única conexão física (cabo, redes sem fio, fibra-ótica, etc.), mas para conseguir direcionar adequadamente os dados enviados/recebidos por aplicações distintas, é utilizado o conceito de portas de comunicação.

Da mesma forma que um endereço IP serve para identificar uma máquina, uma porta de comunicação permite identificar uma aplicação. Vale lembrar ainda que uma interface de rede geralmente é associada a um endereço IP, que possui 65.536 portas (de 0 a 65.535). Assim, quando um programa que utiliza recursos de rede é inicializado, é atribuída uma porta a ele, a qual é adicionada no cabeçalho de cada pacote transmitido pelo programa. Com essas informações é possível identificar para onde enviar um dado e para qual aplicação esse dado deve ser entregue.

...
Quer ler esse conteúdo completo? Tenha acesso completo