programação com sockets · •um datagrama é transmitido entre processos quando um processo o...

75
Programação com Sockets Datagramas Sistemas Distribuidos e Paralelos

Upload: doque

Post on 09-Dec-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Programação com SocketsDatagramas

Sistemas Distribuidos e Paralelos

Objetivo

• Desenvolver programas que permitam o envio de informação pela rede mediante sockets usando o protocolo UDP.

Bibliografía

• Deitel, H. M. & Deitel, H. Java: How to Program (Late Objects).(Pearson Education Limited, 2014).

Introdução

• As redes atuais utilizam o packet switching para a transferência de dados.

• Os dados se envolvem em pacotes que se transferem de uma origem a um destino, onde se extraem de um em um os dados de um ou mais pacotes para reconstruir a mensagem original.

• Os tumores que se comunicam através de Internet utilizam principalmente dois protocolos:• TCP - Transsmision Control Protocol

• UDP - (Universal | User) Datagram Protocol

Introdução

• O envio de datagramas é similar a enviar uma carta através do serviçopostal: A ordem de saída não é importante e não está garantido, ecada mensagem é independente de qualquer outro.

Datagramas

• Um datagrama é um pacote de dados que constitui o mínimo blocode informação em uma rede de comutação por datagramas, a qual éum dos dois tipos de protocolo de comunicação por comutação depacotes usados para encaminhar por rotas diversas sortes unidadesde informação entre nodos de uma rede, por isso se diz que não estáorientado a conexão.

• A alternativa a esta comutação de pacotes é o circuito virtual,orientado a conexão.

Datagramas

•Os datagramas se compõem de:•uma cabeceira con informação de controle e•os dados que se desejam transmitir.

Datagramas

• Um datagrama enviado mediante UDP é transmitido de um processoemissor a um processo receptor sem reconhecimento ourecomprobaciones.

• Se tiver lugar uma falha, a mensagem pode não chegar.

• Um datagrama é transmitido entre processos quando um processo oenvia e outro processo o recebe.

• Qualquer processo que precise enviar ou receber mensagens deveem primeiro lugar criar um socket a um endereço de Internet e a umporto local.

Datagramas

• Um servidor enlaçará esse socket a um porto servidor - um que se fazconhecido aos clientes de maneira que possam enviar mensagens aomesmo.

• Um cliente enlaça seu socket a qualquer porto local livre.

• O método receptor devolve a endereço de Internet e o porto doemissor, além disso da mensagem, permitindo aos receptores enviaruma resposta.

Datagramas

• As classes Java para estabelecer comunicações mediante datagramassão:

• DatagramPacket e

• DatagramSocket.

A classe DatagramPacket

• A classe DatagramPacket proporciona um construtor que permitecriar instâncias de um array de bytes parar:• a mensagem, a longitude da mensagem,

• a endereço Internet e

• o porto local do socket do destino, da seguinte forma:

array de bytes que contém a

mensagem

longitude da mensagem

endereço Intenet número de porto

La clase DatagramPacket

• Os objetos do tipo DatagramPacket se podem transmitir entre processos quando um processo os envia e outro os recebe.

• Esta classe proporciona outro construtor para usá-lo quando se recebe uma mensagem.

• Seus argumentos especificam um array de bytes no que receber a mensagem e a longitude do array.

• Quando se recebe uma mensagem fica no DatagramPacket junto com sua longitude, a endereço de Internet e o porto do socket de envio.

La clase DatagramPacket

• Pode-se obter a mensagem do objeto DatagramPacket mediante o método getData().

• Os métodos getPort() e getAddress() permitem obter o porto e a endereço Internet do objeto de tipo DatagramPacket.

• O processo receptor da mensagem tem que especificar um array de bytes de um tamanho determinado no qual receber a mensagem, isto é, tem que predizer o Tamanho da Mensagem.

• Se a mensagem for muito grande para o array se trunca quando chega.

La clase DatagramPacket

• O protocolo IP subjacente permite longitudes de pacotes de mais de216 bytes, que inclui tanto as cabeceiras como as mensagens

• Entretanto, a maioria dos entornos impõem uma restrição no tamanho a 8 kilobytes.

• Qualquer aplicação que necessite mensagens maiores que o máximo, deve fragmentá-los em pedaços desse tamanho.

• Geralmente, uma aplicação decidirá sobre um tamanho que não seja excessivamente grande mas que se adeque a seu uso previsto.

A classe DatagramSocket

• A classe DatagramSocket dá suporte a sockets para o envio erecepção de datagramas UDP.

• Proporciona-se um construtor que toma um porto como argumento,para que seja usado pelos processos que precisam usar um portoparticular.

• Também se proporciona um construtor sem argumentos que permiteao sistema escolher um porto local livre.

• Estes construtores podem lançar uma exceção do tipoSocketException se o porto já estiver em uso ou se está reservado.

A classe DatagramSocket

Esta classe conta com os seguintes métodos:

• send() e receive().Estes métodos permitem transmitir datagramas entre um par de sockets.

O argumento do send é uma instância de um DatagramPacket que contém umamensagem e seu destino.

O argumento do receive é um objeto DatagramPacket vazio no qual ficará amensagem, sua longitude e sua origem.

Tanto o método send() como o receive() podem lançar uma IOException.

A classe DatagramSocket

• As comunicações mediante datagramas do UDP usam envios nãobloqueadores (non-blocking sends) e recepções bloqueantes(blocking receives).

• As operações de envio retornam quando estas deram a mensagemaos protocolos IP ou UDP subjacentes, os quais são responsáveis portransmiti-los a seu destino.

• Na chegada, a mensagem é posta em uma cauda pelo socket que estáassociado ao porto de destino.

• A mensagem pode ser recolhido da cauda por uma exceção ouchamadas futuras de recepcion (receive()) sobre esse socket.

A classe DatagramSocket

As mensagens são descartadas no destino se nenhum processo tiver um socket associado ao porto de destino.

O método receptor (receive()) bloqueia-se até que se recebe um datagrama, a menos que se estabeleça um tempo limite (timeout) sobre o socket.

Se o processo que invocar ao método receive() tem outra tarefa que fazer enquanto espera pela mensagem, deveria planificar-se em um fluxo de execução (thread) separado.

A classe DatagramSocket

• setSoTimeout()o Este método permite estabelecer um tempo de espera. Com um tempo de

espera estabelecido, o método receive() bloqueará-se pelo tempoespecificado e então lançará uma InterruptedIOException().

• connect()o Este método utiliza-se para conectar a um porto remoto particular e uma

endereço de Internet, neste caso o socket solo é capaz de enviar e recebermensagens desde essa endereço.

Datagrams: Connectionless Client/Server Interaction

• No seguinte exemplo se utilizam datagramas para enviar pacotes deinformação via User Datagram Protocol (UDP) entre uma aplicação clientee uma aplicação servidor

• Na aplicação cliente, o usuário escreve uma mensagem em um campo detexto e pressiona Enter

• O programa converte a mensagem em acerto de byte e os coloca em umpacote de datagrama que é enviado ao servidor

• O servidor recebe o pacote e amostra a informação que contém, entãodevolve o pacote de volta ao cliente.

• Logo depois de receber o pacote, o cliente mostra a informação quecontém

Server class

Server class

Server class

Server class

Server class

Server class

Server class

Server class

Server Class

• A classe Server declara dois DatagramPackets que o servidor usa para enviar e receber informação e um DatagramSocket que envia e recebe pacotes. O construtor, que é chamado do main, cria a GUI em que a informação dos pacotes será mostrada.

• A linha 30 usa o contructor do DatagramSocket que toma um argumento (inteiro representando o número de porto, 5000 neste exemplo) para vincular o servidor a um porto onde este pode receber pacotes de um cliente. Os clientes enviam pacotes a este servidor especificando o mesmo número de porto no pacote que enviem.

• Uma exceção SocketException é arrojado se o construtor do DatagramSocket falha em unir o DatagramSocket ao porto especificado.

Client Class

Client Class

Client Class

Client Class

Client Class

Client Class

Client class

Client Class

• O cliente trabalha de maneira similar ao servidor, exceto o cliente envia pacotes só quando o usuário escreve uma mensagem no campo de texto e pressiona a tecla Enter.

• Quando isto ocorre, o programa chama o método actionPerformed (linhas 32-57), que converte o String que entrou o usuário em um acerto de byte (delineia 41).

• As linhas 44-45 cria um DatagramPacket e o inicializa com um acerto de byte, a longitude do String que foi entrado pelo usuário, a endereço IP aonde o pacote tem que ser enviado (InetAddress.getLocalHost() neste exemplo) e o porto ao qual o servidor está esperando por pacotes (5000 neste exemplo).

• Na linha 47 se envia o pacote

Client Class

• O cliente neste exemplo deve saber que o servidor receberá pacote pelo porto 5000, a não ser, o servidor não receberá os pacotes.

• O construtor do DatagramSocket (linha 71) nesta aplicação não especifica nenhum argumento

• Este construtor sem argumentos permite ao computador selecionar o seguinte número de porto disponível para o DatagramSocket.

• O cliente não precisa especificar um número de porto, porque o servidor recebe o número do porto do cliente como parte de cada DatagramPacketenviado pelo cliente.

• Este é, o servidor pode enviar pacotes de volta ao mesmo computador e número de porto do qual recebeu a informação de um pacote.

Client/Server Tic-Tac-Toe Using a MultithreadedServer

• A seguir apresentamos um popular jogo chamado TicTacToeimplementado usando técnicas cliente / servidor com fluxos de sockets.

• O programa consiste em uma aplicação TicTacToeServer que permite a duas aplicações TicTacToeClient conectar-se ao servidor e jogar TicTacToe.

• Exemplos da saída são mostradas ao final.

TicTacToeServer Class

TicTacToeServer Class

TicTacToeServer Class

TicTacToeServer Class

TicTacToeServer Class

TicTacToeServer Class

Estudo independente

TicTacToeClient Class

• Cada aplicativo TicTacToeClient mantém sua própria versão GUI da placa Tic-Tac-Toe na qual ele exibe o estado do jogo.

• Os clientes podem colocar uma marca apenas em um quadrado vazio.

• A classe interna Square implementa cada um dos nove quadrados no quadro.

• Quando um TicTacToeClient começa a execução, ele cria um JTextAreaem que as mensagens do servidor e uma representação da placa usando nove objetos Square são exibidos.

• O método startClient abre uma conexão ao servidor e obtém os fluxos de entrada e saída associados do objeto Socket.

TicTacToeClient Class

• O Class TicTacToeClient implementa a interface Runnable para que uma thread separada possa ler mensagens do servidor.

• Esta abordagem permite ao usuário interagir com o quadro (no segmento de despacho de eventos) enquanto aguarda mensagens do servidor.

• Depois de estabelecer a conexão com o servidor, executa o cliente com o ExecutorService do trabalhador.

• O método de execução controla o segmento de execução separado.

• O método primeiro lê o caractere de marca (X ou O) do servidor, então segue continuamente e lê mensagens do servidor.

• Cada mensagem é passada para o método processMessage para processamento.