Java2_Aula03

47
Comunicação Via Rede O lado do Cliente Prof. Ricardo Linden

description

Java-aula

Transcript of Java2_Aula03

  • Comunicao Via RedeO lado do ClienteProf. Ricardo Linden

  • Modelo Cliente ServidorPedidoResultadoPrograma ClienteProgramaServidorMquina ClienteMquina ServidoraRede

  • O programa servidor aceita pedidos de dados/servios por parte dos programas clientes e retorna os resultados para estes usarem.

    Servidores podem se encaixar em vrias categorias:Servidores de arquivosServidores de bancos de daosServidores de comunicaoServidores de vdeoOutros

    Definio do Modelo

  • Modelo Cliente ServidorComea primeiroEspera passivamente por contatos de clientes em locais pr-definidos.Responde a pedidosComea depoisAtivamente contata o servidor com um pedido.Espera por uma resposta do servidor.ServidorClienteParadigma cliente-servidor: forma de comunicao usada pelos aplicativos de rede modernos.

  • TerminologiaServidorUm programa executado que aceita contatos atravs de uma rede e presta algum tipo de serviocomputador de classe de servidor (server-class)Hardware potente o suficiente para executar um servidor.InformalmenteO termo servidor frequentemente usado para definir o computador.

  • Caractersticas de um clienteAplicativo arbitrrioTorna-se cliente temporariamentePode realizar outras computaesChamado diretamente pelo usurioExecuta localmente no computador do usurioInicia contato ativamente com o servidor.Contacta um servidor de cada vez.

  • Direo do fluxo de dadosO dado pode fluirapenas do cliente para o servidorapenas do servidor para o clienteem ambas as direesO protocolo da aplicao determina a direo do fluxo.Cenrio tpicoCliente envia pedido(s)O servidor envia resposta(s)

  • ProtocoloUma descrio formal de formatos de mensagens e das regras que duas ou mais mquinas devem seguir para poder comunicar-se.

    OlOlTCP connection req.

  • Uso de CPU pelo servidorServidor opera como outros aplicativos, usando a CPU para executar instrues e realizando operaes de E/S

    Esperar um dado chegar via rede no requer tempo de CPU.

    Por conseguinte, o programa servidor s usa a CPU quando estiver atendendo um pedido.

    No caso do SAGE Expert, o uso de mquina em situaes normais fica em menos de 0,3% da CPU.

  • A Sute de Protocolos TCP/IP Permite que computadores de vrios tipos, fornecedores e sistemas operacionais possam comunicar-seHistria:Anos 60: comeou como um projeto financiado pelo departamento de defesa americanoAnos 70 e 80: Estabeleceu-se firmemente na comunidade cientfica - primeiro americana e depois mundialAnos 90: comeou a tornar-se a forma mais comum de conexo entre redesCirca 1994: Comeo dos sites comerciais e uso generalizado da Internet.

  • A Sute de Protocolos TCP/IP um sistema aberto de acordo com a seguinte definio:A definio da sute de protocolos e muitas de suas implementao esto disponveis de graa ou por preos irrisrios a base da Internet (com I maisculo), que uma rede que liga milhes de computadores por todo o globo.

  • Camadas TCP/IPProtocolos de rede sp desemvolvidos em camadasUma sute de protocolos como o TCP/IP uma combinao de protocolos em vrias camadas

    O modelo OSI tem sete camadas, mas no TCP/IP ns s temos quatro.Importante : cada camada tem seu protocolo!

  • As quatro camadas do TCP/IPAplicaoTransporteEnlaceclienteFTPTCPServidorFTPTCPIPIPEthernetDriverIPIPEthernetDriverEthernetDriverEthernetDriver(Comunicao Ponto-a-Ponto)Rede(Device Driver e placa de rede)(Nvel de preocupao dos usurios)(roteamento)

  • A Interface SocketsA API Sockets de Berkeley Originalmente desenvolvida como parte do Unix BSDBSD = Berkeley Software DistributionAPI=Application Program InterfaceHoje em dia a mais popular API para programadores C/C++/Java que estejam escrevendo aplicativos sobre TCP/IPTambm usado em ambiente Windows

  • A Interface SocketsIdia bsica : um socket como um arquivoVoc pode ler e escrever na rede da mesma maneira que o faz com um arquivo.Para comunicao orientada a conexo (por exemplo, TCP)servidores realizam operaes de escuta (listen) e aceitao (accept) de conexoclientes realizam operaes de conexo (connect)ambos os lados realizam operaes de leitura (read) e escrita (write) (ou send e recv)Ambos os lados tm que fechar a conexo (close)

  • Protocolos sem conexoExemplo, UDP

    No necessitam da fase de estabelecimento de conexo

    Usam sendto e recvfrom

    Hoje em dia a maioria dos aplicativos trabalha orientada a conexo (usando TCP-IP), logo no veremos mais sobre protocolos sem conexo como o UDP

  • Endereo InternetCada interface na internet deve ter um Endereo Internet, ou Endereo IP nico.Um endereo IP um nmero de 32 bits.Ele usualmente escrito usando a notao decimal com pontos.Exemplos:2365328673 um inteiro sem sinal que equivale a1000 1100 1111 1100 0000 1101 0010 0001 em binrio8C FC 0D 21 em hexadecimal140.252.13.33 em notao decimal com pontosA aparncia deste nmero bem diferente da do primeiro pois este nmero pega cada 8 bits do nmero binrio e transforma em um nmero decimal14033

  • Domain Name SystemA interface da rede e os hosts so conhecidos pelos protocolos pelos seus endereos IP (por exemplo 128.175.201.5)J os seres humanos trabalham melhor com nomes como gloin.cis.udel.edu ou brahms.udel.eduDomain Name System (DNS): um banco de dados distribudos para mapear entre nomes de hosts e endereos IPA maioria das aplicaes aceita qualquer uma das duas opes de endereamento, mas o nome do host ligeiramente mais lento, dada a necessidade de primeiro resolver o endereo (transform-lo em endereo IP)128.175.201.5DNSgloin.cis.udel.edu

  • Nmero de PortaPodemos fazer uma analogia entre o nmero da porta de um aplicativo e o nmero do apartamento de uma pessoa.

    O endereo do cmputador (hostname) onde roda o servidor, em contrapartida, o nmero do prdio.

    O porteiro do prdio, ao receber correspondncias, deve ler no envelope delas o apartamento para o qual deve destin-las. Se tudo correr bem, todos os apartamentos s recebero as correspondncias a eles destinados.

    A porta serve o mesmo propsito de discriminao, s que entre aplicativos.

  • A pilha de comunicaoNa prtica, como se funcionasse da seguinte maneira:Cliente

    socketportas

    TCP/UDPIPServidor

    socketportas

    TCP/UDPIP

  • O que so SocketsModelo cliente servidor: o cliente usa um servio provido pelo servidor

    TCP prov um servio de comunicao confivel, ponto-a-ponto para aplicaes cliente servidor

    Um socket um dos lados de um elo de comunicao bilateral entre dois programas rodando na rede.

    Um socket est ligado a um nmero de porta de forma que a camada TCP possa identificar a aplicao para quem o dado deve ser enviado.

  • Como funcionam os Sockets?Um servidor executa em um computador especfico e tem um socket que est ligado a um nmero de porta especfico.O cliente sabe o endereo do host e a porta do servidor e tenta fazer um pedido de conexo.

  • Conexo EstabelecidaSe o servidor aceita a conexo ele liga o novo socket a uma porta diferente.

    Ele precisa de um novo socket para esta comunicao especfica pois precisa continuar escutando o socket anterior para receber novas conexes.

  • Um servidor...A maioria dos servidores constituda de aplicativos multitarefas.

    Isto significa que eles podem atender s requisies de mltiplos clientes ao mesmo tempo.

    Logo, enquanto eles atendem um cliente precisam continuar prestando ateno ao socket original de forma a saber quando chegarem outras requisies de novos clientes.

  • SimplificandoEntretanto, este processo totalmente transparente para o processo usurio.

    Pense em uma comunicao via sockets como similar quela feita com duas latinhas e um barbante.

    Se o outro lado mover a latinha dele, ainda assim voc escutar e falar da mesma maneira.

  • Um socket como um canoConceitualmente poderamos pensar da seguinte maneira:

    ClienteServidor

    PortasO encanamento do socketAs coisas que fluem pelo encanamento

  • O que entra pelo cano?Vrias coisas podem trafegar pelo encanamento dos sockets.

    Especialmente duas:Objetos Caracteres

    No caso esta aula, ns usamos um protocolo extremamente simples, sempre baseado em texto puro.

  • Suporte a sockets em JavaO package java.net fornece uma classe chamada Socket, que implementa um lado da comunicao bilateral entre seu programa e outro da rede.

    Tambm existe uma classe chamada ServerSocket que implementa um socket de servidor para escutar e aceitar conexes por parte de um cliente.

    Como nosso objetivo neste momento desenvolver clientes, ns no vamos ver esta classe, mas em aulas posteriores conversaremos sobre o assunto.

  • Passos bsicosPassos bsicos para criar um clienteAbrir um socketCriar uma stream de entrada e outra de sada no socket.Ler e escrever nas streams para realizar comunicao com o servidorFechar as streamsFechar o socket.

  • Abrindo um socketSockets so representados em Java pela classe Socket.

    O construtor mais usado nesta classe o seguinte:Socket(String Hostname, int Port)

    Um exemplo de uso deste construtor : Socket meuSocket = new Socket(meuhost.com.br, 20000)

  • ExceesO construtor da classe socket pode lanar duas excees:UnknownHostException : quando no reconhece o host IOException : quando tem problemas genricos em criar o socket

    Logo, tudo que fizermos com isto deve ser feito dentro de um bloco try. Exemplo:Socket MyClient; try { MyClient = new Socket(host", PortNumber); } catch (UnknownHostException e) { System.out.println(Nao consigo resolver o endereo); } catch (IOException e) { System.out.println(e); }

  • Notas de JavaO socket tem que ser definido for a do bloco try, seno gera um erro de compilao.O bloco catch de UnknownHostException tem que vir antes do bloco catch de IOException, seno nunca ser referenciado.Hierarquia de classes:

    ObjectThrowableExceptionIOExceptionUnknownHostException

  • Criando streams de sadaTemos que criar uma stream de sada para mandar pedidos para o servidor.

    A classe que representa streams de sada em modo texto (o nico que usamos em um cliente orientado a conexo) PrintWriter.

    Para criar este objeto, ns o associamos ao stream de sada do socket que criamos no comando anterior.

    O stream de sada associado ao socket criado obtido pelo mtodo getOutputStream() da classe Socket.

  • Criando streams de sadaLogo, a linha de criao do stream de sada a seguinte:PrintWriter outData=new PrintWriter( s.getOutputStream());

    Assim como o mtodo de criao do socket, esta linha de comando pode gerar excees.

    Neste caso, a nica classe gervel IOException

    Assim, tambm temos que cercar esta linha por um bloco try..catch.

  • Mandando dadosAgora estamos prontos para mandar dados para o servidor.

    Isto feito atravs dos mtodos print e println da classe PrintWriter.

    Ao fim da escrita, temos que dar um flush na stream.

    Exemplo:outData.println("Aplic10"); outData.flush();

  • Criando streams de entradaTemos que criar tambm um stream de entrada para receber os resultados provenientes do servidor.

    A classe que representa streams de sada em modo texto (o nico que usamos em um cliente orientado a conexo) BufferedReader.

    Para criar este objeto, ns o associamos ao stream de entrada do socket que criamos no comando anterior.

    O stream de sada associado ao socket criado obtido pelo mtodo getInputStream() da classe Socket.

  • Criando streams de entradaLogo, a linha de criao do stream de sada a seguinte:BufferedReader inData=new BufferedReader( s.getInputStream());

    Assim como o mtodo de criao do socket, esta linha de comando pode gerar excees.

    Neste caso, a nica classe gervel IOException

    Assim, tambm temos que cercar esta linha por um bloco try..catch.

  • Lendo dadosAgora podemos ler os dados com os mtodos read e readline da classe BufferedReader.

    Ao fim da entrada, a string lida ser igual a null, o que permite identificar o fim da entrada.

    Exemplo:while((line=inData.readLine()) !=null) { System.out.println(line); }

  • Destravando nosso programaO problema deste comando que quando no h nenhum dado proveniente do servidor, ele simplesmente bloqueia e espera at algum dado chegar.

    O dado pode ser perdido no caminho ou possvel que nenhuma resposta seja esperada.

    Logo, interessante estabelecer um timeout razovel ao fim do qual decidamos concluir que nenhum dado foi recebido do servidor.

    Isto feito dentro do Socket, usando o mtodo setSoTimeout()

  • Destravando nosso programaQuando o timeout ocorrer, nosso readLine ser interrompido e uma exceo da classe InterruptedIOException ser gerada.

    Logo, temos que cercar nosso readLine por um bloco try..catch, da seguinte maneira:try { while((line=inData.readLine()) !=null) { //processa o dado } } catch (InterruptedIOException FimIO) { System.out.println("No recebi nada."); }

  • TerminandoAo fim de nossa leitura, devemos fechar a stream de entrada com o mtodo close()inData.close();

    O mesmo deve ser feito com o socket de sada.outData.close();

    Igualmente fechamos o socket ao fim de toda comunicao gerada.s.close();

    O servidor percebe o fim do cliente recebendo uma mensagem de tamanho zero (ou uma string nula).

  • Cliente Exemploimport java.io.*;import java.net.*;import javax.swing.*;public class meuCliente {public static void main(String args[]) { try { String mensagem,line; Socket s=new Socket("d11-8", 20000); s.setSoTimeout(1000); BufferedReader inData=new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter outData=new PrintWriter( s.getOutputStream()); outData.println("Mensagem de conexao"); outData.flush();

  • Cliente Exemplo (2) mensagem="x"; while(!(mensagem.equals(""))) { //Escrevendo o comando mensagem=JOptionPane.showInputDialog("Entre com a mensagem a enviar para o servidor"); outData.println(mensagem); outData.flush(); //Lendo a resposta try { while((line=inData.readLine()) !=null) { System.out.println(line); } } catch (InterruptedIOException FimIO) {System.out.println("Recebi "+ FimIO.bytesTransferred +" bytes - "+FimIO.getMessage()); }

  • Cliente Exemplo (3) } // while //Encerrando o processo outData.close(); s.close(); System.exit(0); } catch (Exception e) {}} //main} //class

  • St94, p. 1