You are on page 1of 31

Redes de Computadores

Programao com Sockets

Prof. Othon Batista (othonb@yahoo.com)

Pgina 1

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: Exemplo de Aplicao Servidor Web Simples

Prof. Othon Batista (othonb@yahoo.com)

Pgina 2

Introduo
Objetivo: aprender a construir aplicaes cliente/servidor usando sockets. Os sockets apareceram pela primeira vez em uma implementao do BSD Unix 4.1 em 1981.
Devem ser explicitamente criados, usados e liberados. Paradigma cliente/servidor. So a forma mais usada de comunicao entre processos (IPC Inter Process Communication).

H dois tipos de sockets: UDP e TCP.


Prof. Othon Batista (othonb@yahoo.com) Pgina 3

A Arquitetura TCP/IP
Aplicaes cliente/servidor
Servio orientado conexo e confivel. SEGMENTO

Aplicao TCP IP
Rede Fsica

UDP

Servio no orientado conexo e no confivel. DATAGRAMA Servio no orientado conexo e no confivel. DATAGRAMA

Comunicao atravs de endereos IP e portas lgicas.


Prof. Othon Batista (othonb@yahoo.com) Pgina 4

A Arquitetura TCP/IP
Os endereos IP so formados por quatro nmeros, tipicamente separados por pontos. Cada nmero tem o tamanho de 1 byte (0 255). Exemplo: 10.125.3.45 Alguns endereos IP so reservados (no nos interessam neste momento)! H tambm os nomes simblicos, que devem ser traduzidos para endereos IP por algum servio, tal como o DNS. Exemplo: www.fib.br.
Prof. Othon Batista (othonb@yahoo.com) Pgina 5

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!

Prof. Othon Batista (othonb@yahoo.com)

Pgina 6

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!


Prof. Othon Batista (othonb@yahoo.com) Pgina 7

O Protocolo UDP
datagramas 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...
Prof. Othon Batista (othonb@yahoo.com) Pgina 8

O Protocolo TCP
segmentos TCP

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

Prof. Othon Batista (othonb@yahoo.com)

Pgina 9

Qual Protocolo Usar : UDP ou TCP?


TCP deve ser escolhido para aplicaes que necessitam de transferncia de dados confivel, por 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 no confiveis (protocolos de roteamento, tal como RIP).
Prof. Othon Batista (othonb@yahoo.com) Pgina 10

Socket com TCP


Um socket uma porta entre o processo de aplicao e um protocolo de transporte fim-a-fim.
controlado pelo programador de aplicao controlado pelo sistema operacional

processo socket TCP com buffers, variveis

processo socket TCP com buffers, variveis

controlado pelo programador de aplicao controlado pelo sistema operacional

Internet

Cliente

Servidor

Prof. Othon Batista (othonb@yahoo.com)

Pgina 11

Socket com TCP


O processo servidor deve estar em execuo. O servidor deve ter criado socket que aguarda contato do cliente. O cliente cria socket TCP local. O cliente especifica endereo IP, nmero de porta do processo servidor. Quando o cliente cria um socket, o TCP do cliente estabelece conexo com TCP do servidor Quando contatado pelo cliente, o TCP do servidor cria socket novo para que o processo servidor possa se comunicar com o cliente o servidor conversa com mltiplos clientes
Pgina 12

Prof. Othon Batista (othonb@yahoo.com)

Socket com TCP


ponto de vista da aplicao TCP prov transferncia confivel, ordenada de bytes (tubo) entre cliente e servidor

Prof. Othon Batista (othonb@yahoo.com)

Pgina 13

Cliente l linha da entrada padro (doUsurio), envia para servidor via socket (paraServidor). Servidor l linha do socket. Servidor converte linha para letras maisculas, devolve para o cliente. Cliente l linha modificada do socket (doServidor), imprime-a.

Socket com TCP: Exemplo de Aplicao

para_servidor

do_usuario

socket do cliente Pgina 14

Prof. Othon Batista (othonb@yahoo.com)

do_servidor

Fluxo de entrada: seqncia de bytes recebida pelo processo. Fluxo de sada: seqncia de bytes transmitida pelo processo.

Servidor

Socket com TCP: Exemplo de Aplicao


(executa em nomeHosp)

cria socket, porta=x, para receber pedido: socketRecepo = ServerSocket ()

Cliente

aguarda chegada de configurao pedido de conexo socketConexo = socketRecepo.accept() l pedido de socketConexo escreve resposta para socketConexo fecha socketConexo

TCP

cria socket, abre conexo a nomeHosp, porta=x socketCliente = Socket() Envia pedido usando socketCliente

l resposta de socketCliente fecha socketCliente

Prof. Othon Batista (othonb@yahoo.com)

Pgina 15

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; Cria fluxo de entrada Cria socket de cliente, conexo ao servidor Cria fluxo de sada ligado ao socket BufferedReader doUsuario = new BufferedReader(new InputStreamReader(System.in)); Socket socketCliente = new Socket(nomeHosp", 6789); DataOutputStream paraServidor = new DataOutputStream(socketCliente.getOutputStream());

Prof. Othon Batista (othonb@yahoo.com)

Pgina 16

Socket com TCP: Exemplo de Aplicao (Cliente)


Cria fluxo de entrada ligado ao socket BufferedReader doServidor = new BufferedReader(new InputStreamReader(socketCliente.getInputStream())); frase = doUsuario.readLine(); Envia linha ao servidor L linha do servidor paraServidor.writeBytes(frase + '\n'); fraseModificada = doServidor.readLine(); System.out.println(Do Servidor: " + fraseModificada); socketCliente.close(); } }

Prof. Othon Batista (othonb@yahoo.com)

Pgina 17

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(new InputStreamReader(socketConexao.getInputStream()));

Cria socket para recepo na porta 6789 Aguarda, no socket para recepo, o contato do cliente Cria fluxo de entrada, ligado ao socket

Prof. Othon Batista (othonb@yahoo.com)

Pgina 18

Socket com TCP: Exemplo de Aplicao (Servidor)


Cria fluxo de sada, ligado ao socket L linha do socket Escreve linha ao socket } } Final do elo while, volta ao incio e aguarda conexo de outro cliente DataOutputStream paraCliente = new DataOutputStream(socketConexo.getOutputStream()); fraseCliente= doCliente.readLine(); fraseEmMaiusculas= fraseCliente.toUpperCase() + '\n'; paraClient.writeBytes(fraseEmMaiusculas); }

Prof. Othon Batista (othonb@yahoo.com)

Pgina 19

Socket com UDP


UDP no estabelece conexo. remetente coloca explicitamente endereo IP e porta do destino. servidor deve extrair endereo IP, porta do remetente do datagrama recebido. Os dados transmitidos podem ser recebidos fora de ponto de vista da aplicao ordem, ou perdidos. UDP prov transferncia
no confivel de grupos de bytes (datagramas) entre cliente e servidor

Prof. Othon Batista (othonb@yahoo.com)

Pgina 20

Socket com UDP


Servidor
(executa em nomeHosp)

Cliente
cria socket, socketCliente = DatagramSocket() cria, enderea (nomeHosp, porta=x, envia pedido em datagrama usando socketCliente

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

l pedido do socketServidor escreve resposta ao socketServidor especificando endereo IP, nmero de porta do cliente

l resposa do socketCliente fecha socketCliente

Prof. Othon Batista (othonb@yahoo.com)

Pgina 21

Socket com UDP: Exemplo de Aplicao (Cliente)

Prof. Othon Batista (othonb@yahoo.com)

Pgina 22

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();

Cria fluxo de entrada Cria socket de cliente Traduz nome de hospedeiro ao endereo IP usando DNS

Prof. Othon Batista (othonb@yahoo.com)

Pgina 23

Socket com UDP: Exemplo de Aplicao (Cliente)


Cria datagrama com dados para enviar, comprimento, endereo IP, porta Envia datagrama ao servidor L datagrama do servidor
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(); } }

Prof. Othon Batista (othonb@yahoo.com)

Pgina 24

Socket com UDP: Exemplo de Aplicao (Servidor)

Prof. Othon Batista (othonb@yahoo.com)

Pgina 25

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 socket para datagramas na porta 9876

Aloca memria para receber datagrama Recebe datagrama

Prof. Othon Batista (othonb@yahoo.com)

Pgina 26

Socket com UDP: Exemplo de Aplicao (Servidor)


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

Obtm endereo IP, no. de porta do remetente

InetAddress IPAddress = pacoteRecebido.getAddress(); int porta = pacoteRecebido.getPort(); String fraseEmMaiusculas = frase.toUpperCase(); dadosEnviados = fraseEmMaiusculas.getBytes();

Cria datagrama p/ enviar ao cliente Escreve datagrama no socket


}

DatagramPacket pacoteEnviado = new DatagramPacket(dadosEnviados, dadosEnviados.length, IPAddress, porta); socketServidor.send(pacoteEnviado); } }

Fim do elo while, volta ao incio e aguarda chegar outro datagrama

Prof. Othon Batista (othonb@yahoo.com)

Pgina 27

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 do arquivo solicitado precedido por linhas de cabealho Envia a resposta diretamente ao cliente.

Prof. Othon Batista (othonb@yahoo.com)

Pgina 28

Servidor Web Simples


Contm a classe StringTokenizer que usada para examinar o pedido Primeira linha da mensagem de pedido HTTP e Nome do arquivo solicitado Aguarda conexo do cliente Cria fluxo de Entrada Cria fluxo de Sada
import 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());

Prof. Othon Batista (othonb@yahoo.com)

Pgina 29

Servidor Web Simples


L a primeira linha do pedido HTTP que deveria ter o seguinte formato: GET file_name HTTP/1.0 Examina a primeira linha da mensagem para extrair o nome do arquivo
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);

Associa o fluxo inFile ao arquivo fileName Determina o tamanho do arquivo e constri um vetor de bytes do mesmo tamanho

Prof. Othon Batista (othonb@yahoo.com)

Pgina 30

Servidor Web Simples


Inicia a construo da mensagem de resposta Transmisso do cabealho da resposta HTTP.
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"); } }

Prof. Othon Batista (othonb@yahoo.com)

Pgina 31

You might also like