Continuando nosso post anterior, veremos neste post um exemplo de comunicação TCP usando socket. O exemplo é bem simples:
um cliente conecta em um servidor
o cliente envia para o servidor uma sequência de bytes fora de ordem
o servidor recebe os dados, ordena e devolve ao cliente de forma ordenada.
Veremos duas variações do servidor. A primeira realiza um loop while, o servidor bloquea esperando uma conexão, quando recebe a conexão, o servidor processa (e enquanto isto não aceita outras conexões). A segunda versão, cria uma thread para cada conexão, assim pode receber conexões simultâneas de diversos clientes.
Neste post e nos próximos dois mostrarei como é feita a comunicação via socket em Java. Apresentarei as classes neste primeiro post:
Para TCP utilizaremos basicamente:
java.net.ServerSocket: cria um socket de comunicação TCP para o lado servidor
java.net.Socket: cria um socket de comunicação (pode ser utilizado por ambos os lados)
enquanto para UDP utilizaremos
java.net.DatagramSocket: representa um socket para enviar e receber datagrama (pacotes UDP). Deve ser utilizado para enviar e/ou receber os pacotes pela rede. Estes pacote são dirigidos e encaminhados individualmente. Os diversos pacotes enviados a partir de um computador podem ser encaminhados de forma diferente e pode chegar em qualquer ordem no outro computador.
java.net.DatagramPacket: esta classe representa um datagrama (isto é, o dado que queremos transmitir ou que recebemos). O serviço de entrega é sem conexão, ou seja, a mensagem é encaminhada a partir de um computador para outro baseado somente na informação contida dentro dele. A entrega de pacotes e sua ordem não são garantidos.
Nos dois posts seguintes veremos um exemplo de comunicação TCP e outro em UDP.
A classe InetAddress é utilizada pelo Java para representar um endereço de Internet ou endereço IP, que consiste em um número de 32-bit ou 128-bit sem sinal. Esta arquitetura é definida pelas RFC 790: Assigned Numbers, RFC 1918: Address Allocation for Private Internets, RFC 2365: Administratively Scoped IP Multicast e RFC 2373: IP Version 6 Addressing Architecture.
Uma instância de InetAddress consiste em um endereço IP e seu nome de host correspondente (se fez a resolução do nome). Veremos no vídeo como esta classe se comporta. Devemos notar que existem diversos métodos estáticos e métodos que se comportam como factories que facilitam o tratamento deste tipo de informação. A classe InetAddress não tem construtores visíveis. Para criar um objeto InetAddress, você tem que usar um dos métodos disponíveis de fábrica. Os métodos tipo factorysão uma convenção em que métodos estáticos em uma classe que retornam uma instância da classe InetAddress.