Baixe o app para aproveitar ainda mais
Prévia do material em texto
CURSO DE CIÊNCIA DA COMPUTAÇÃO DISCIPLINA: DESENVOLVIMENTO DE APLICAÇÕES DISTRIBUÍDAS TEMA 07 – SOCKETS TEXTO PARA APOIO AO ESTUDO 1) Introdução Inicialmente, poderíamos nos perguntar o que são sockets? Qual é o papel deles em sistemas distribuídos? Quais protocolos são utilizados? Java tem alguma funcionalidade relativa a sockets? O que deve ser considerado quando se trocam mensagens de dados entre nós em um sistema? Java tem recursos que suportam a comunicação por rede. Sockets podem ser estabelecidos entre agentes e os protocolos de comunicações de dados podem ser estabelecidos por camadas no topo da conexão do socket. O pacote java.io contém várias classes que podem lidar com os fluxos de entrada e saída de dados. Os recursos de Java que suportam a comunicação por redes fornecem funcionalidades de alto nível como, por exemplo, a possibilidade de se trabalhar com objetos distribuídos, conexões remotas a servidores, entre outros. Os sockets possibilitam a troca de dados entre nós em uma rede por meio de protocolos IP, UDP e TCP. Java, assim como outras linguagens, tem funcionalidades prontas para facilitar o trabalho com sockets na comunicação entre os nós em uma rede. A Figura 1 ilustra o processo de comunicação entre diferentes clientes que acessam um mesmo servidor. Figura 1 – Ilustração da comunicação entre clientes e servidor. Considera-se que a comunicação seja realizada via TCP/IP ou UDP/IP. Vamos detalhar um pouco mais os papéis da camada de “Internet” e da camada de Transporte. Camada de “Internet”: • Identifica a interface de rede de um host: endereço IP (v4,, v6); • Há muitos computadores na internet; • Cada host pode ter mais de um adaptador de rede, cada um deles com um endereço IP diferente como, por exemplo, roteadores. Camada de Transporte: • Para cada adaptador de rede, são definidos os protocolos da camada de transporte; • Cada protocolo pode ser usado por múltiplos processos para cada adaptador de rede. Um socket identifica um canal de comunicação usado por um processo, usando um protocolo da camada de transporte para comunicar por meio de um adaptador de rede. • Para os clientes: sockets podem ser identificados pela combinação dos itens: o Endereço IP (Camada de “Internet”); o Nome do protocolo da camada de Transporte (exemplo: TCP ou UDP); o Porta da camada de Transporte (0 ... 65535). Outro item importante na comunicação por rede é o DNS (Domain Name System) que converte os nomes textuais em endereços de IP como, por exemplo: www.xpto.com.br para 191.165.120.74. Os sockets são recursos exclusivos em toda a rede e que são pertencentes aos processos. Há a divisão entre os sockets dos clientes e os sockets dos servidores. Os sockets dos servidores aceitam conexões de entrada de clientes ou dados. E os sockets dos clientes iniciam a comunicação com um servidor. 2) Sockets TCP O TCP é um protocolo orientado a conexão e os sockets dos servidores esperam por requisições (requests) de conexão de entrada. Os sockets dos clientes, por sua vez, tentam estabelecer uma conexão. Vamos avaliar alguns detalhes sobre os sockets dos clientes e servidores • Sockets dos servidores: o Estão ligados a uma porta específica que, normalmente, é conhecida; o “Escuta” a referida porta a espera das requisições dos clientes; o Criam um novo socket para cada cliente aceito; o Este novo socket se comunica com o referido cliente; o Fecha o socket do servidor. http://www.xpto.com.br/ • Sockets dos clientes: o Estão ligados à portas randômicas, ou seja, não tem um valor específico; o Se conectam a um socket de servidor; o Se comunicam por meio do envio e recebimento de dados; o Fecha o socket. Em Java, o uso dos sockets TCP/IP é mais facilitado. O socket do servidor que aceita conexões é uma instância da classe ServerSocket: • No seu construtor, é passado o valor da porta; • O método accept realiza a espera por conexões, que são retornadas como socket de cliente. E o cliente é uma instância da classe Socket: • Pode ser conectado a um servidor pela passagem do endereço do servidor (InetAddress) e pela porta no construtor; • Para a comunicação, cada socket cliente tem: o Um InputStream para a leitura dos dados recebidos por meio do getInputStream, por exemplo; o Um OutputStream para o envio de dados por meio do getOutputStream, por exemplo; o As leituras são bloqueadas, enquanto as escritas não são bloqueadas. Os sockets são fechados por meio do método close. Todos os itens envolvidos na comunicação podem causar erros e, portanto, é importante trabalhar com o tratamento de exceções (IOException). A Figura 2 ilustra o processo de comunicação envolvendo os sockets de cliente e servidor, assim como os métodos utilizados neste processo. Figura 2 – Ilustração do processo de comunicação por meio de sockets entre cliente e servidor. Sockets orientados a conexão oferecem envio e recebimento sequencial dos dados. Para a entrada e saída sequencial de bytes, Java tem uma API com funcionalidades de leitura e escrita de um fluxo de bytes: • OutputStream: escreve bytes sequencialmente; • InputStream: lê bytes sequencialmente. Socket oferece getInputStream() e getOutputStream() para para a leitura e escrita de fluxos de dados, conforme ilustra a Figura 3: Figura 3 – Ilustração da escrita e leitura de um fluxo de bytes. 3) Sockets UDP UDP é um protocolo não-confiável e sem conexão, ou seja, os sockets dos servidores esperam por pacotes de entrada que podem vir de qualquer lugar ao invés do estabelecimento de conexões. Os clientes tentam enviar os pacotes para o servidor sem estabelecer conexões. Algumas características básicas dos sockets dos servidores e clientes serão descritas a seguir. • Socket do servidor: o Está ligado a uma porta específica e que, usualmente, é conhecida; o Aceitam pacotes dos clientes; o Processam os pacotes de dados que chegam; o Podem, eventualmente, também enviar pacotes; o Fecha o socket do servidor quando termina a comunicação. • Socket do cliente: o Está ligado a portas randômicas, ou seja, os valores das portas podem variar aleatoriamente; o Envia pacotes ao servidor; o Podem, eventualmente, receber pacotes do servidor; o Fecha o socket.
Compartilhar