Programação com Sockets

download Programação com Sockets

of 31

Transcript of Programação com Sockets

  • 8/3/2019 Programao com Sockets

    1/31

    Prof. Othon Batista ([email protected]) Pgi

    Redes de Computadores

    Programao com Sockets

  • 8/3/2019 Programao com Sockets

    2/31

    Prof. Othon Batista ([email protected]) Pgi

    Roteiro

    Introduo A Arquitetura TCP/IP O Protocolo IP O Protocolo UDP O Protocolo TCP Qual Protocolo Usar: UDP

    ou TCP? Socket com TCP Socket com TCP: Exemplo

    de Aplicao

    Socket com UDP Socket com UDP: Exempde Aplicao

    Servidor Web Simples

  • 8/3/2019 Programao com Sockets

    3/31

    Prof. Othon Batista ([email protected]) Pgi

    Objetivo: aprender a construir aplicaescliente/servidor usando sockets. Os sockets apareceram pela primeira vez em um

    implementao do BSD Unix 4.1 em 1981. Devem ser explicitamente criados, usados e liberado Paradigma cliente/servidor. So a forma mais usada de comunicao entre proces

    (IPC Inter Process Communication ). H dois tipos de sockets:UDP e TCP .

    Introduo

  • 8/3/2019 Programao com Sockets

    4/31

    Prof. Othon Batista ([email protected]) Pgi

    A Arquitetura TCP/IP

    TCP UDP

    IP

    Rede Fsica

    Aplicao Servio no orientado conexo e no confivel.DATAGRAMA

    Servio orientado conexo e confivel.

    SEGMENTO

    Aplicaescliente/servidor

    Comunicao atravs deendereos IP e portaslgicas .

    Servio no orientado conexo e no confivel.

    DATAGRAMA

  • 8/3/2019 Programao com Sockets

    5/31

    Prof. Othon Batista ([email protected]) Pgi

    A Arquitetura TCP/IP

    Os endereos IP so formados por quatro nmertipicamente separados por pontos. Cada nmero tem o tamanho de 1 byte (0 255)

    Exemplo:10.125.3.45 Alguns endereos IP so reservados (no nosinteressam neste momento)!

    H tambm os nomes simblicos, que devem sertraduzidos para endereos IP por algum servio,como o DNS. Exemplo:www.fib.br .

  • 8/3/2019 Programao com Sockets

    6/31

    Prof. Othon Batista ([email protected]) Pgi

    Arquitetura TCP/IP

    Conveno para os nmeros de portas: 0 at 1023 portas privilegiadas; 1024 at 65535 portas sem restries.

    Algumas portas privilegiadas: FTP 20 e 21 Telnet 23

    SMTP

    25 POP3 110 DNS 53

    No use estas portas.A no ser que voc saiba

    o que est fazendo!

  • 8/3/2019 Programao com Sockets

    7/31Prof. Othon Batista ([email protected]) Pgi

    O Protocolo IP

    Camada mais baixa da arquitetura TCP/IP. No fim-a-fim. No orientada conexo.

    Usada pelos protocolos UDP e TCP. Servio de datagrama no confivel:

    a entrega de um datagrama no garantida; os datagramas podem ser entregues fora de ordem; podem ser recebidos datagramas duplicados.

    A confiabilidade dada nas camadas acima!

  • 8/3/2019 Programao com Sockets

    8/31Prof. Othon Batista ([email protected]) Pgi

    O Protocolo UDP

    Usado diretamente pelos programas.

    fim-a-fim. No orientado conexo. Servio de datagrama no confivel. Mais gil de TCP. Usado por:DNS, NFS, SNMP, RIP ...

    datagramas UDP

  • 8/3/2019 Programao com Sockets

    9/31Prof. Othon Batista ([email protected]) Pgi

    O Protocolo TCP

    Usado diretamente pelos programas.

    fim-a-fim. Orientado conexo. Servio confivel. Usado por:FTP, TELNET, SMTP, POP3 ...

    segmentos TCP

  • 8/3/2019 Programao com Sockets

    10/31Prof. Othon Batista ([email protected]) Pgin

    Qual Protocolo Usar : UDP ou TCP

    TCP deve ser escolhido para aplicaes quenecessitam de transferncia de dados confivel, exemplo: transferncia de arquivos (FTP); terminais virtuais (TELNET).

    UDP deve ser escolhida para: aplicaes simples de pedido/resposta (DNS); aplicaes que podem tolerar transmisses de dados

    confiveis (protocolos de roteamento, tal como RIP)

  • 8/3/2019 Programao com Sockets

    11/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP

    Um socket uma porta entre o processo deaplicao e um protocolo de transporte fim-a-fi

    processo

    TCP combuffers,variveis

    socket

    controlado peloprogramador de

    aplicao

    controladopelo sistemaoperacional

    Cliente

    processo

    TCP combuffers,

    variveis

    socket

    controlado peloprogramador deaplicao

    controladopelo sistema

    operacional

    Servidor

    Internet

  • 8/3/2019 Programao com Sockets

    12/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP O processo servidor deve

    estar em execuo. O servidor deve ter criado

    socket que aguarda contatodo cliente.

    O cliente cria socket TCPlocal.

    O cliente especificaendereo IP, nmero de porta do processo servidor.

    Quando ocliente cria umsocket, o TCP do clienteestabelece conexo comTCP do servidor

    Quando contatado pelocliente,o TCP do servidor cria socket novopara que o processo servidor possa secomunicar com o cliente o servidor conversa com

    mltiplos clientes

  • 8/3/2019 Programao com Sockets

    13/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP

    TCP prov transferncia confivel, ordenada de bytes

    (tubo) entre cliente e servidor

    ponto de vista da aplicao

  • 8/3/2019 Programao com Sockets

    14/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP:Exemplo de Aplicao

    Cliente l linha da entrada padro (doUsurio ),envia para servidor viasocket ( paraServidor ).

    Servidor l linha do socket. Servidor converte linha

    para letras maisculas,devolve para o cliente.

    Cliente l linha modificadado socket (doServidor ),imprime-a.

    Fluxo de entrada: seqnciade bytes recebida pelo processo.

    Fluxo de sada: seqncia de

    bytes transmitida pelo processo.

    socket do cliente

    do_usuario p a r a

    _ s e r v i d o r

    d o

    _ s e r v i d o r

  • 8/3/2019 Programao com Sockets

    15/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP:Exemplo de Aplicao

    aguarda chegada depedido de conexosocketConexo =socketRecepo.accept()

    cria socket,porta= x , parareceber pedido:

    socketRecepo =ServerSocket ()

    cria socket,

    abre conexo a nomeHosp , porta= xsocketCliente =Socket()

    fechasocketConexo

    l resposta desocketCliente

    fechasocketCliente

    Servidor (executa em nomeHosp ) Cliente

    Envia pedido usandosocketClientel pedido de

    socketConexo

    escreve respostapara socketConexo

    TCP

    configurao

  • 8/3/2019 Programao com Sockets

    16/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP:Exemplo de Aplicao (Cliente)

    import java.io.*;import java.net.*;class ClienteTCP {

    public static void main(String argv[]) throws Exception{

    String frase;String fraseModificada;

    BufferedReader doUsuario =new BufferedReader(new InputStreamReader(System.in));

    Socket socketCliente = new Socket(nomeHosp", 6789);

    DataOutputStream paraServidor =new DataOutputStream(socketCliente.getOutputStream());

    Criafluxo de entrada

    Cria

    socket de cliente,conexo ao servidorCria

    fluxo de sadaligado ao socket

    k

  • 8/3/2019 Programao com Sockets

    17/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP:Exemplo de Aplicao (Cliente)

    BufferedReader doServidor =new BufferedReader(newInputStreamReader(socketCliente.getInputStream()));

    frase = doUsuario.readLine();

    paraServidor.writeBytes(frase + '\n');

    fraseModificada = doServidor.readLine();

    System.out.println (Do Servidor: " + fraseModificada );

    socketCliente.close();

    }}

    Criafluxo de entradaligado ao socket

    Envia linhaao servidor

    L linhado servidor

    k

  • 8/3/2019 Programao com Sockets

    18/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP:Exemplo de Aplicao (Servidor)

    import java.io.*;import java.net.*;

    class servidorTCP {

    public static void main(String argv[]) throws Exception{

    String fraseCliente;StringfFraseMaiusculas;

    ServerSocket socketRecepcao = new ServerSocket(6789);

    while(true) {

    Socket socketConexao = socketRecepcao.accept();

    BufferedReader doCliente =new BufferedReader(newInputStreamReader(socketConexao.getInputStream()));

    Cria socketpara recepona porta 6789

    Aguarda, no socket

    para recepo, ocontato do cliente

    Cria fluxo deentrada, ligado

    ao socket

    k

  • 8/3/2019 Programao com Sockets

    19/31Prof. Othon Batista ([email protected]) Pgin

    Socket com TCP:Exemplo de Aplicao (Servidor)

    DataOutputStream paraCliente =new DataOutputStream(socketConexo.getOutputStream()) ;

    fraseCliente= doCliente.readLine();fraseEmMaiusculas= fraseCliente.toUpperCase() + '\n';

    paraClient.writeBytes(fraseEmMaiusculas);}

    }}

    L linhado socket

    Cria fluxode sada, ligado

    ao socket

    Escreve linhaao socket

    Final do elo while,volta ao incio e aguardaconexo de outro cliente

  • 8/3/2019 Programao com Sockets

    20/31Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP

    UDP no estabelece conexo. remetente coloca explicitamente endereo IP e porta do destino.

    servidor deve extrair endereo IP, porta doremetente do datagrama recebido. Os dados transmitidos podem ser recebidos for

    ordem, ou perdidos. UDP prov transferncia no confivel de grupos de bytes (datagramas) entre cliente e servidor

    ponto de vista da aplicao

  • 8/3/2019 Programao com Sockets

    21/31

    Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP

    fechasocketCliente

    Servidor (executa em nomeHosp )

    l resposa dosocketCliente

    cria socket,socketCliente =DatagramSocket()

    Cliente

    cria, enderea ( nomeHosp, porta=x,envia pedido em datagramausando socketCliente

    cria socket,porta= x , parapedido que chega:socketServidor =DatagramSocket()

    l pedido dosocketServidor

    escreve resposta

    ao socketServidor especificando endereoIP, nmero de portado cliente

    S k UDP

  • 8/3/2019 Programao com Sockets

    22/31

    Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP:Exemplo de Aplicao (Cliente)

    S k UDP

  • 8/3/2019 Programao com Sockets

    23/31

    Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP:Exemplo de Aplicao (Cliente)

    import java.io.*;

    import java.net.*;

    class clienteUDP {public static void main(String args[]) throws Exception{

    BufferedReader do Usuario=new BufferedReader(new InputStreamReader(System.in));

    DatagramSocket socketCliente = new DatagramSocket();

    InetAddress IPAddress = InetAddress.getByName(nomeHosp");

    byte[] sendData = new byte[1024];byte[] receiveData = new byte[1024];

    String frase = doUsuario.readLine();

    sendData = frase.getBytes();

    Criafluxo de entrada

    Criasocket de cliente

    Traduz nome dehospedeiro ao

    endereo IPusando DNS

    S k UDP

  • 8/3/2019 Programao com Sockets

    24/31

    Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP:Exemplo de Aplicao (Cliente)

    DatagramPacket pacoteEnviado =new DatagramPacket(dadosEnvio, dadosEnvio.length,

    IPAddress, 9876);

    socketCliente.send(pacoteEnviado);

    DatagramPacket pacoteRecebido =new DatagramPacket(dadosRecebidos, dadosRecebidos.length);

    socketCliente.receive(pacoteRecebido);

    String fraseModificada =new String(pacoteRecebido.getData());

    System.out.println(Do Servidor:" + fraseModificada);socketCliente.close();}

    }

    Cria datagrama comdados para enviar,comprimento,

    endereo IP, porta

    Envia datagramaao servidor

    L datagramado servidor

    S k UDP

  • 8/3/2019 Programao com Sockets

    25/31

    Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP:Exemplo de Aplicao (Servidor)

    S k UDP

  • 8/3/2019 Programao com Sockets

    26/31

    Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP:Exemplo de Aplicao (Servidor)

    import java.io.*;import java.net.*;

    class servidorUDP {public static void main(String args[]) throws Exception

    {

    DatagramSocket socketServidor = new DatagramSocket(9876);

    byte[] dadosRecebidos = new byte[1024];byte[] dadosEnviados = new byte[1024];

    while(true){

    DatagramPacket pacoteRecebido =new DatagramPacket(dadosRecebidos,

    dadosRecebidos.length);

    socketServidor.receive(pacoteRecebido);

    Cria socketpara datagramas

    na porta 9876

    Aloca memria parareceber datagrama

    Recebedatagrama

    S k UDP

  • 8/3/2019 Programao com Sockets

    27/31

    Prof. Othon Batista ([email protected]) Pgin

    Socket com UDP:Exemplo de Aplicao (Servidor)

    String frase = new String(pacoteRecebido.getData());

    InetAddress IPAddress = pacoteRecebido.getAddress();

    int porta = pacoteRecebido.getPort();

    String fraseEmMaiusculas = frase.toUpperCase();

    dadosEnviados = fraseEmMaiusculas.getBytes();

    DatagramPacket pacoteEnviado =new DatagramPacket(dadosEnviados,

    dadosEnviados.length, IPAddress, porta);

    socketServidor.send(pacoteEnviado);}

    }

    }

    Obtm endereoIP, no. de porta

    do remetente

    Escreve

    datagramano socketFim do elo while,volta ao incio e aguardachegar outro datagrama

    Cria datagrama p/enviar ao cliente

  • 8/3/2019 Programao com Sockets

    28/31

    Prof. Othon Batista ([email protected]) Pgin

    Servidor Web Simples

    Funes do servidor Web: Trata apenas um pedido HTTP por vez Aceita e examina o pedido HTTP Recupera o arquivo pedido do sistema de arquivos do

    servidor Cria uma mensagem de resposta HTTP consistindo d

    arquivo solicitado precedido por linhas de cabealho

    Envia a resposta diretamente ao cliente.

  • 8/3/2019 Programao com Sockets

    29/31

    Prof. Othon Batista ([email protected]) Pgin

    Servidor Web Simplesimport java.io.*;import java.net.*;import java.util.*;

    class WebServer {public static void main(String argv[]) throws Exception{

    String requestMessageLine;String fileName;

    ServerSocket listenSocket = new ServerSocket(6789);Socket connectionSocket = listenSocket.accept();

    BufferedReader inFromClient =

    new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

    DataOutputStream outToClient =new DataOutputStream(

    connectionSocket.getOutputStream());

    Contm a classeStringTokenizer que

    usada para examinaro pedido

    Aguarda conexodo cliente

    Primeira linha da mensagem

    de pedido HTTP eNome do arquivo solicitado

    Cria fluxode Entrada

    Cria fluxode Sada

  • 8/3/2019 Programao com Sockets

    30/31

    Prof. Othon Batista ([email protected]) Pgin

    Servidor Web Simples

    requestMessageLine = inFromClient.readLine();

    StringTokenizer tokenizedLine =new StringTokenizer(requestMessageLine);

    if (tokenizedLine.nextToken().equals("GET")){fileName = tokenizedLine.nextToken();if (fileName.startsWith("/") == true )

    fileName = fileName.substring(1);

    File file = new File(fileName);int numOfBytes = (int) file.length();

    FileInputStream inFile = new FileInputStream (fileName);

    byte[] fileInBytes = new byte[];inFile.read(fileInBytes);

    L a primeira linha do

    pedido HTTP que deveriater o seguinte formato:GET file_name HTTP/1.0

    Examina a primeira linha

    da mensagem para extrairo nome do arquivo

    Associa o fluxo inFile ao arquivo fileName

    Determina o tamanho doarquivo e constri um vetor

    de bytes do mesmo tamanho

  • 8/3/2019 Programao com Sockets

    31/31

    P f Oth B ti t ( th b@ h ) Pgi

    Servidor Web Simples

    outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n");

    if (fileName.endsWith(".jpg")) outToClient.writeBytes("Content-Type: image/jpeg\r\n");

    if (fileName.endsWith(".gif")) outToClient.writeBytes("Content-Type:

    image/gif\r\n");outToClient.writeBytes("Content-Length: " + numOfBytes +

    "\r\n");outToClient.writeBytes("\r\n");

    outToClient.write(fileInBytes, 0, numOfBytes);

    connectionSocket.close();}

    else System.out.println("Bad Request Message");}

    }

    Transmisso docabealho da resposta

    HTTP.

    Inicia a construo damensagem de resposta