You are on page 1of 47

Comunicao Via Rede

O lado do Cliente
Prof. Ricardo Linden

Modelo Cliente Servidor


Programa
Cliente

Mquina
Cliente

Pe
di

do

Re
sul
tad
o

Rede

Programa
Servidor

Mquina
Servidora

Definio do Modelo
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 arquivos
Servidores de bancos de daos
Servidores de comunicao
Servidores de vdeo
SQL *Net
TCP/IP
Outros

SQL *Net
TCP/IP

S Q L*
Forms
ORACLE

Modelo Cliente Servidor


Paradigma cliente-servidor: forma de comunicao usada pelos
aplicativos de rede modernos.
Servidor

Cliente

Comea primeiro

Comea depois

Espera passivamente por


contatos de clientes em locais
pr-definidos.

Ativamente
contata
servidor com um pedido.

Responde a pedidos

Espera por uma resposta do


servidor.

Terminologia
Servidor
Um programa executado que aceita contatos atravs de uma rede
e presta algum tipo de servio
computador de classe de servidor (server-class)
Hardware potente o suficiente para executar um servidor.
Informalmente
O termo servidor frequentemente usado para definir o
computador.

Caractersticas de um cliente
Aplicativo arbitrrio
Torna-se cliente temporariamente
Pode realizar outras computaes
Chamado diretamente pelo usurio
Executa localmente no computador do usurio
Inicia contato ativamente com o servidor.
Contacta um servidor de cada vez.

Direo do fluxo de dados


O dado pode fluir
apenas do cliente para o servidor
apenas do servidor para o cliente
em ambas as direes
O protocolo da aplicao determina a direo do fluxo.
Cenrio tpico
Cliente envia pedido(s)
O servidor envia resposta(s)

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

TCP connection
req.

Ol

TCP connection
reply.

Que horas so,


por favor

Get http://gaia.cs.umass.edu/index.htm

2:00

<file>
tempo

Uso de CPU pelo servidor


Servidor 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-se
Histria:
Anos 60: comeou como um projeto financiado pelo
departamento de defesa americano
Anos 70 e 80: Estabeleceu-se firmemente na comunidade
cientfica - primeiro americana e depois mundial
Anos 90: comeou a tornar-se a forma mais comum de
conexo entre redes
Circa 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/IP
Protocolos de rede sp desemvolvidos em camadas
Uma sute de protocolos como o TCP/IP uma combinao de
protocolos em vrias camadas
Importante : cada camada tem seu protocolo!

O modelo OSI tem sete camadas, mas no TCP/IP ns s temos quatro.

As quatro camadas do TCP/IP


Aplicao

FTP cliente

Servidor
server
FTP
FTP
server
(Nvel de preocupao dos usurios)

Transporte
TCP

(Comunicao Ponto-a-Ponto)

TCP

Rede

IP

IP

(roteamento)

Enlace

IP

IP

Ethernet Ethernet
EthernetEthernet
Driver Driver (Device Driver e Driver Driver
placa de rede)

A Interface Sockets
A API Sockets de Berkeley
Originalmente desenvolvida como parte do Unix BSD
BSD = Berkeley Software Distribution
API=Application Program Interface

Hoje em dia a mais popular API para programadores


C/C++/Java que estejam escrevendo aplicativos sobre
TCP/IP
Tambm usado em ambiente Windows

A Interface Sockets
Internet

file.dat

Idia bsica : um socket como um arquivo


Voc 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 conexo
clientes 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 conexo


Exemplo, 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 Internet
Cada 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 a
1000 1100 1111 1100 0000 1101 0010 0001 em binrio
140
33
8C FC 0D 21 em hexadecimal
140.252.13.33 em notao decimal com pontos
A aparncia deste nmero bem diferente da do
primeiro pois este nmero pega cada 8 bits do
nmero binrio e transforma em um nmero
decimal

Domain Name System

DNS

gloin.cis.udel.edu
128.175.201.5

A 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.edu
Domain Name System (DNS):
(DNS) um banco de dados distribudos
para mapear entre nomes de hosts e endereos IP
A 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)

Nmero de Porta
Podemos 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 comunicao
Na prtica, como se funcionasse da seguinte maneira:
Cliente

Servidor

socket

socket

portas

portas

TCP/UDP

TCP/UDP

IP

IP

O que so Sockets
Modelo 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 Estabelecida
Se 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.

Simplificando
Entretanto, 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.
No percebe nenhuma diferena

Um socket como um cano


Conceitualmente poderamos pensar da seguinte maneira:
Portas

Cliente

Servidor

O encanamento do socket

As 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 Java


O 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 bsicos

Passos bsicos para criar um cliente


Abrir um socket
Criar uma stream de entrada e outra de sada no socket.
Ler e escrever nas streams para realizar comunicao com o
servidor
Fechar as streams
Fechar o socket.

Abrindo um socket
Sockets 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)
Mquina onde roda o servidor
(endereo solvel por DNS)

Porta definida pelo servidor

Excees
O 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 Java
O 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:
Object
Throwable
Exception
IOException
UnknownHostException

Criando streams de sada


Temos 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 sada


Logo, 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 dados
Agora 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("<curso>Aplic</curso><nota>10</nota>");
outData.flush();

Criando streams de entrada


Temos 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 entrada


Logo, 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 dados
Agora 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 programa


O 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(<milissegundos>)

Destravando nosso programa


Quando 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.");
}

Terminando
Ao 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 Exemplo
import 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

You might also like