Buscar

Sistemas Distribuídos e Sockets

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 80 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 80 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 80 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Conteúdo da Disciplina
1 CARACTERÍSTICAS DE UM SISTEMA DISTRIBUÍDO
2 COMUNICAÇÃO ENTRE PROCESSOS
3 MODELO CLIENTE / SERVIDOR
4 SOCKETS
5 CHAMADA REMOTA DE PROCEDIMENTO (RPC)
6 CHAMADA DE MÉTODO (RMI)
7 ARQUITETURA PEER TO PEER
8 IMPLEMENTAÇÃO DE PROJETO PRÁTICO
9 WEB SERVICE
10 COMPUTAÇÃO EM NUVEM
11 TRANSAÇÕES DISTRIBUÍDAS E SISTEMAS DE ARQUIVOS
DISTRIBUÍDOS
Denis Julien SISTEMAS DISTRIBUÍDOS 1 / 80
Conteúdo da Disciplina
1 CARACTERÍSTICAS DE UM SISTEMA DISTRIBUÍDO
2 COMUNICAÇÃO ENTRE PROCESSOS
3 MODELO CLIENTE / SERVIDOR
4 SOCKETS
5 CHAMADA REMOTA DE PROCEDIMENTO (RPC)
6 CHAMADA DE MÉTODO (RMI)
7 ARQUITETURA PEER TO PEER
8 IMPLEMENTAÇÃO DE PROJETO PRÁTICO
9 WEB SERVICE
10 COMPUTAÇÃO EM NUVEM
11 TRANSAÇÕES DISTRIBUÍDAS E SISTEMAS DE ARQUIVOS
DISTRIBUÍDOS
Denis Julien SISTEMAS DISTRIBUÍDOS 2 / 80
Conteúdo da Disciplina
1 CARACTERÍSTICAS DE UM SISTEMA DISTRIBUÍDO
2 COMUNICAÇÃO ENTRE PROCESSOS
3 MODELO CLIENTE / SERVIDOR
4 SOCKETS
5 CHAMADA REMOTA DE PROCEDIMENTO (RPC)
6 CHAMADA DE MÉTODO (RMI)
7 ARQUITETURA PEER TO PEER
8 IMPLEMENTAÇÃO DE PROJETO PRÁTICO
9 WEB SERVICE
10 COMPUTAÇÃO EM NUVEM
11 TRANSAÇÕES DISTRIBUÍDAS E SISTEMAS DE ARQUIVOS
DISTRIBUÍDOS
Denis Julien SISTEMAS DISTRIBUÍDOS 3 / 80
SISTEMAS DISTRIBUÍDOS
Sockets UDP/TCP - programação em C e Java
Denis Julien
Denis Julien SISTEMAS DISTRIBUÍDOS 4 / 80
SOCKETS UDP/TCP
1 Apresentação geral dos sockets
2 Sockets UDP
Sockets UDP em C
Sockets UDP em Java
3 Sockets TCP
Sockets TCP em C
Sockets TCP em Java
4 Multicast UDP/IP
Denis Julien SISTEMAS DISTRIBUÍDOS 5 / 80
Apresentação geral dos sockets
SOCKETS UDP/TCP
TCP ou UDP:
comunicação entre aplicações
sem visibilidade dos sistemas (equipamentos) intermediários da
camada de rede (3)
Denis Julien SISTEMAS DISTRIBUÍDOS 6 / 80
Apresentação geral dos sockets
SOCKETS UDP/TCP - Endereçamento
Endereçamento de comunicação entre aplicação
endereço de rede de uma aplicação :
endereço IP : máquina na qual a aplicação esta rodando
número de porta : identifica a aplicação na máquina
camada de Rede : endereço IP (ex. 192.129.12.34)
camada transporte : número de porta TCP ou UDP
endereço aplicação : "protocolo://endereço ip :porta"
ex: "http://192.129.3.4 : 8080" ie. servidor web na máquina
192.129.3.4 escutando na porta 8080
Denis Julien SISTEMAS DISTRIBUÍDOS 7 / 80
Apresentação geral dos sockets
SOCKETS UDP/TCP
Socket : Tomada
Associado localmente a uma porta (0-65535)
serviços de emissão e recepção de dados sobre a socket via a porta
em modo conectado (TCP)
conexão : um link entre 2 aplicações
a cada extremidade é associado um socket
um socket onde ser ligado
a uma porta específica pedida pelo programa
a uma porta qualquer determinada pelo sistema operacional
Denis Julien SISTEMAS DISTRIBUÍDOS 8 / 80
Apresentação geral dos sockets
SOCKETS UDP/TCP
Um socket é :
um ponto de acesso a camada Transporte (TCP/UDP) ligada
localmente a uma porta
endereçamento da aplicação na rede : @IP:port
Denis Julien SISTEMAS DISTRIBUÍDOS 9 / 80
Sockets UDP
SOCKETS UDP - Princípios
"Modo datagrama"
envia de pacotes de dados (datagramas)
sem conexão entre cliente e servidor
não confiável sem gerenciamento da comunicação :
um pacote pode não chegar ao destinatário
um pacote P2 enviado após um pacote P1 pode chegar antes do
pacote P1 (pb roteamento)
um pacote enviado ao um destinatário não pronto a recebe-lo é
descartado sem informar o remetente
características das primitivas de acesso a camada UDP
emissão de datagrama é não bloqueante
recepção de datagrama é bloqueante (exceto se tem datagramas não
lidos)
Denis Julien SISTEMAS DISTRIBUÍDOS 10 / 80
Sockets UDP
SOCKETS UDP - Princípios
Princípio de utilização:
a aplicação servidor cria um socket e a associa a uma porta
a aplicação servidor espera a recepção de pacotes chegando no socket
o cliente envia um pacote seu socket indicando o endereço do
destinatário : par (@IP,porta).
@IP : endereço IP do servidor
porta na qual o servidor está esperando os pacotes
quando o servidor recebe uma pacote no socket, nesse pacote tem
(@IP,porta) do remetente (para que o servidor possa responder).
Denis Julien SISTEMAS DISTRIBUÍDOS 11 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP - programação em C
SOCKET UDP EM LINGUAGEM C
Denis Julien SISTEMAS DISTRIBUÍDOS 12 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Estruturas de Dados em C
conjunto de estruturas de dados para manipular endereços das
máquinas, portas, sockets, . . .
Endereço IP (Versão 4) de uma máquina:
os 4 bytes de um endereço IP
são codificados por um inteiro
sem sinal sobre 32 bits
ex: 192.168.12.40 corresponde
ao valor 0xC0A80C28
Denis Julien SISTEMAS DISTRIBUÍDOS 13 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Conversão de tipo para o endereço IP:
conversão de in_addr para uma string ”X .X .X .X”.
conversão string ”X .X .X .X” para in_addr ou inteiro long .
a função inet_aton não é disponível em todo Sistema Operacional.A
função padrão é inet_addr
atenção : a constante INADDR_NONE é também o endereço de
broadcast (”255.255.255.255”)
Denis Julien SISTEMAS DISTRIBUÍDOS 14 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Identificador de uma máquina
IP (V4) → h_addrtype = AF_NET e h_length = 4
uma máquina pode ter vários endereços IP e nome de hospedeiro.
Denis Julien SISTEMAS DISTRIBUÍDOS 15 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Acesso aos indentificadores da máquina local
gethostname : Recupera o (primeiro) nome da máquina local e o
armazena na memória apontada pela variável nome na forma de uma
string (com caractere fim de string)
se o comprimento do nome tiver maior do que o valor da variável comp
a função dará os comp primeiros caractares .
retorna 0 se sucesso −1 se não
gethostid : retorna o endereço IP na forma de um inteiro long (4
bytes)
Denis Julien SISTEMAS DISTRIBUÍDOS 16 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Acesso aos indentificadores de uma máquina distante
gethostbyname : retorna um estrutura hostent que contém o
identificador da máquina cujo nome é repassado em parâmetro. A
função retornará NULL se nenhuma máquina for achado.
pesquisa primeiro no arquivo local /etc/host
A estrutura hostent está na memória estática do processo. Ela é atualizada
a cada chamada de gethostbyname. Para conservar a informação tem que
fazer um memcpy.
Denis Julien SISTEMAS DISTRIBUÍDOS 17 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Exemplo de uso do gethostbyname:
Denis Julien SISTEMAS DISTRIBUÍDOS 18 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Acesso aos indentificadores de uma máquina distante
inet_pton : conversão de IP no formato texto em IP no formato
binário. (IP V6 e IP V4)
gethostbyaddr : retorna um estrutura hostent que contém o
identificador da máquina cujo endereço IP é repassado em parâmetro.
A função retornará NULL se nenhuma máquina for achado.
pesquisa primeiro no arquivo local /etc/hosts
A estrutura hostent está na memória estática do processo. Ela é atualizada
a cada chamada de gethostbyaddr. Para conservar a informação tem que
fazer um memcpy.
Denis Julien SISTEMAS DISTRIBUÍDOS 19 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Exemplo de uso do gethostbyaddr:
Denis Julien SISTEMAS DISTRIBUÍDOS 20 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Identificador de um Socket TCP-UDP/IP:
criação
Denis Julien SISTEMAS DISTRIBUÍDOS 21 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Criação de um Socket TCP-UDP/IP: 3 parâmetros
tipo de endereçamento (IPV4) ou (IPV6)
tipo de protocolo
SOCK_DGRAM → UDP
SOCK_STREAM → TCP
SOCK_RAW → nível mais baixo (IP , ICMP)
númerodo protoloc , 0 = default.
Denis Julien SISTEMAS DISTRIBUÍDOS 22 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Criação de um Socket TCP-UDP/IP: retorna um inteiro socket_num
se socket_num== −1 → erro
usar errno ou perror para conhecer o erro. Ver arquivo <errno.h>
fechamento socket : int close(int socket_num) ;
Denis Julien SISTEMAS DISTRIBUÍDOS 23 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Associação de um socket a uma port : bind
int bind(int sock_desc, struct sockaddr * endereco, socklen_t
comprimento_endereco);
int sock_desc : número do socket
struct sockaddr * endereco : endereço local de associação
textbfsocklen_t comprimento_endereco : comprimento da estrutura
Denis Julien SISTEMAS DISTRIBUÍDOS 24 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Recuperação informação sobre um socket
int getsockname(int sock_desc, struct socaddr * endereco, int *
comprimento_endereco) ;
int sock_desc : número do socket
struct socaddr * endereco : conterá o endereço
textbfsocklen_t comprimento_endereco :
na chamada: o comprimento em byte da zona memória pronta a
receber a informação
na volta : o comprimento efetivo do endereço
Denis Julien SISTEMAS DISTRIBUÍDOS 25 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Representação dos números em função do material (hardware e sistema
operacional) :
Big Endian : byte de peso forte a esquerda
Little Endian : byte de peso forte a direita
para evitar mal interpretação dos números
codificação em "formato de rede", um formato neutra.
4 operações fazem a tradução "formato rede"para formato local
u_short htons(u_short) : inteiro curto para inteiro "rede"
u_long htonl(u_long) : inteiro curto para inteiro "rede"
u_short ntohs(u_short) : inteiro curto para inteiro "rede"
u_long ntohl(u_long) : inteiro curto para inteiro "rede"
inteiro curto : número de porta (16 bits)
inteiro longo : número IP (32 bits)
Denis Julien SISTEMAS DISTRIBUÍDOS 26 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Envio de dados em UDP
int sendto(int sock_desc, void * mensagem, int comprimento, int opcao
, struct socaddr * endereco, intcomprimento_endereco) ;
int sock_desc : número do socket
void * mensagem : apontador sobre os dados a enviar
int comprimento : comprimento dos dados
int opcao : 0
struct socaddr * endereco : endereço destinatário
textbfsocklen_t comprimento_endereco : comprimento endereço
Retorna
número de bytes realmente enviados
−1 em caso de erro (ver errno e perror)
Denis Julien SISTEMAS DISTRIBUÍDOS 27 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Recepção de dados em UDP
int recvfrom(int sock_desc, void * mensagem, int comprimento, int
opcao , struct socaddr * endereco, int * comprimento_endereco) ;
int sock_desc : número do socket que está esperando os dados
void * mensagem : apontador sobre um zona memória alocada para
receber os dados
int comprimento : comprimento da zona memória de recepção
int opcao : 0 ou MSG_PEEK
struct socaddr * endereco : endereço do socket do remetente
textbfsocklen_t comprimento_endereco : comprimento endereço
Retorna
número de bytes realmente recebidos
−1 em caso de erro (ver errno e perror)
Denis Julien SISTEMAS DISTRIBUÍDOS 28 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Recepção de dados em UDP (continuação)
Opção MSG_PEEK
o pacote não será extraído do buffer de recepção
e portanto na próxima recepção de dados teremos o mesmo dados no
buffer.
recepção é bloqueante por defeito, exceto se pacotes foram recebidos
e não ainda lidos.
Denis Julien SISTEMAS DISTRIBUÍDOS 29 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C
Tamanho dos dados em envio ou recepção
Não tem limite em comprimento para os dados circulando nos
pacotes, mas:
Para caber em um único pacote IP, o datagrama UDP não deve
ultrapassar mais de 65535 bytes de dados.
Em prática: é aconselhado de não ultrapassar 8176 bytes para os
datagrama UDP, pois a maior parte dos SO limitam os pacotes a 8
Kbytes
Para ser seguro de não perder informação, limitar a 512 bytes máximo
Se um datagrama é demais comprido: os dados são truncados
Denis Julien SISTEMAS DISTRIBUÍDOS 30 / 80
Sockets UDP Sockets UDP em C
SOCKETS UDP EM C - EXEMPLO
Cliente / Servidor Básico em UDP
O cliente manda a mensagem "Bom dia"para o servidor e espera uma
resposta.
o servidor escuta e assim que recebe a mensagem manda uma
mensagem de reconhecimento "bem recebido"ao remetente.
Servidor é identificado:
nome "sockservtest"(deve declarar no arquivo hosts por exemplo)
porta 4000
Denis Julien SISTEMAS DISTRIBUÍDOS 31 / 80
Sockets UDP Sockets UDP em C
Código fonte cliente:
Denis Julien SISTEMAS DISTRIBUÍDOS 32 / 80
Sockets UDP Sockets UDP em C
Código fonte cliente:
Denis Julien SISTEMAS DISTRIBUÍDOS 33 / 80
Sockets UDP Sockets UDP em C
Código fonte cliente:
Denis Julien SISTEMAS DISTRIBUÍDOS 34 / 80
Sockets UDP Sockets UDP em C
Código fonte cliente:
Denis Julien SISTEMAS DISTRIBUÍDOS 35 / 80
Sockets UDP Sockets UDP em C
Código fonte servidor:
Denis Julien SISTEMAS DISTRIBUÍDOS 36 / 80
Sockets UDP Sockets UDP em C
Código fonte servidor:
Denis Julien SISTEMAS DISTRIBUÍDOS 37 / 80
Sockets UDP Sockets UDP em C
Código fonte servidor:
Denis Julien SISTEMAS DISTRIBUÍDOS 38 / 80
Sockets UDP Sockets UDP em C
Código fonte servidor:
Denis Julien SISTEMAS DISTRIBUÍDOS 39 / 80
Sockets UDP Sockets UDP em C
Código fonte servidor:
Denis Julien SISTEMAS DISTRIBUÍDOS 40 / 80
Sockets UDP Sockets UDP em Java
SOCKETS UDP - programação em JAVA
SOCKET UDP EM JAVA
Denis Julien SISTEMAS DISTRIBUÍDOS 41 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java
Não tem diferenças fundamentais de funcionamento em relação com a
utilização em C
Características idênticas
modo não conectado, comunicação por datagrama
sem gerenciamento do comprimento dos dados enviados
possibilidade de perda de dados que seja em emissão como em
recepção.
Denis Julien SISTEMAS DISTRIBUÍDOS 42 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java
Java integra as funcionalidades de comunicação de rede acima de
TCP-UDP/IP.
package java.net
Classes utilizadas via datagrama (UDP):
InetAddress: codificação dos endereços IP
DatagramSocket: socket em modo não conectado
DatagramPacket: pacote de dados enviados vi um socket sem conexão
(UDP)
Denis Julien SISTEMAS DISTRIBUÍDOS 43 / 80
Sockets UDP Sockets UDP em Java
Codificação endereço IP
Classe InetAddress
Construtores : não tem, usa-se métodos estáticos para criar a
instância (objeto).
Métodos:
public static InetAddress getByName(String host)
throws UnknownHostException
cria uma instância da classe InetAddress que identifica a máquina cujo
nome é repassado em parâmetro
a exceção é lançada se o serviço de nome (DNS. . . ) do sistema não
achar a máquina na rede.
pode utilizar um endereço IP da forma "192.12.23.24" em lugar do
nome, nesse caso o serço de nome não é usado.
um outro método permite definir o endereço IP na forma de 4 bytes.
Denis Julien SISTEMAS DISTRIBUÍDOS 44 / 80
Sockets UDP Sockets UDP em Java
Codificação endereço IP
Classe InetAddress
Métodos (continuação):
public static InetAddress getLocalHost()
throws UnknownHostException
retorna o endereço IP da máquina na qual roda o programa, ou seja o
endereço IP local
public String getHostName()
retorna o nome da máquina cujo endereço é dado por um objeto
InetAddress.
Denis Julien SISTEMAS DISTRIBUÍDOS 45 / 80
Sockets UDP Sockets UDP em Java
Datagrama
Classe DatagramPacket
Construtores :
public void DatagramPacket(byte[] buf, int length)
criação de um pacote para receber dados (na forma de uma tabela de
bytes)
os dados recebidos serãoguardados em buf
length: da o comprimento máximo de dados a ler. Garantir que
length ≤ comprimento de buf
variante do construtor com um offset para não começar no inicio da
tabela
Denis Julien SISTEMAS DISTRIBUÍDOS 46 / 80
Sockets UDP Sockets UDP em Java
Datagrama
Classe DatagramPacket
Construtores (continuação) :
public void DatagramPacket(byte[] buf, int length,
InetAddress address, int port)
criação de um pacote para enviar dados (na forma de uma tabela de
bytes)
buf: contém os dados a enviar
length: comprimento dos dados a enviar. Garantir que length
≤comprimento de buf
address: endereço IP da máquina destinatária dos dados
port : número de porta da máquina destinatária
Denis Julien SISTEMAS DISTRIBUÍDOS 47 / 80
Sockets UDP Sockets UDP em Java
Datagrama
Classe DatagramPacket
Métodos get :
InetAddress getAddress()
Se pacote a enviar : endereço da máquina destinatária
Se pacote recebido: endereço da máquina remetente (que enviou o
pacote)
InetAddress getPort()
Se pacote a enviar : porta destinatária na máquina destinatária
Se pacote recebido: porta utilizada pela máquina remetente (que
enviou o pacote)
InetAddress getData()
Dados do pacote
InetAddress getlength()
Se pacote a enviar : comprimento dos dados a enviar
Se pacote recebido: comprimento dos dados recebidos
Denis Julien SISTEMAS DISTRIBUÍDOS 48 / 80
Sockets UDP Sockets UDP em Java
Datagrama
Classe DatagramPacket
Métodos set :
void setAddress(InetAddress adr)
Posiciona o endereço IP da máquina destinatária do pacote.
void setPort(int port)
Posiciona a porta destinatária do pacote
void setData(byte [] data)
Posiciona os dados do pacote
void setlength(int length)
posiciona o comprimento dos dados a enviar.
Denis Julien SISTEMAS DISTRIBUÍDOS 49 / 80
Sockets UDP Sockets UDP em Java
Sockets em modo datagrama (UDP)
Classe DatagramSocket
Socket em modo datagrama
Construtores
public DatagramSocket()
throws SocketException
cria um novo socket ligado ao uma porta livre (valor aleatória)
Exceção lançada em caso de problema(normalmente não deveria ter)
public DatagramSocket(int port)
throws SocketException
cria um novo socket ligado ao uma porta local definida pelo parâmetro
portlivre (valor aleatória)
Exceção lançada em caso de problema : quando a porta já está
ocupada
Denis Julien SISTEMAS DISTRIBUÍDOS 50 / 80
Sockets UDP Sockets UDP em Java
Sockets em modo datagrama (UDP)
Classe DatagramSocket
métodos de emissão / recepção de pacotes
public void send(DatagramPacket p)
throws IOException
Envia o pacote repassado em parâmetro. O destinatário é identificado
pelo par (endereço IP, porta) definido no pacote.
Exceção lançada em caso de problema de I/O
public void receive(DatagramPacket p)
throws IOException
recebe um pacote de dados
bloqueante enquanto um pacote não foi recebido
quando um pacote chega, os atributos do pacote p são atualizados.
os dados recebidos são copiados na tabela repassada em parâmetro no
momento da criação de p e seu comprimento é posicionado com o
comprimento dos dados recebidos
os atributos de endereço IP e de porta de p são atualizados com
aqueles do socket do remetente (máquina que envio o pacote)
Envia o pacote repassado em parâmetro. O destinatário é identificado
pelo par (endereço IP, porta) definido no pacote.
Exceção lançada em caso de problema de I/O
Denis Julien SISTEMAS DISTRIBUÍDOS 51 / 80
Sockets UDP Sockets UDP em Java
Sockets em modo datagrama (UDP)
Classe DatagramSocket
outros métodos
public void close()
Fecha o socket e libera a porta na qual estava ligado.
public int getLocalPort()
retorna a porta na qual está ligado o socket.
Possibilidade de criar um canal (mas sempre em modo não conectado)
Para restringir a comunicação com um único hospedeiro distante
pois por default pode receber no socket pacotes vindo de qualquer
lugar.
opção que não existe em C.
Denis Julien SISTEMAS DISTRIBUÍDOS 52 / 80
Sockets UDP Sockets UDP em Java
Sockets em modo datagrama (UDP)
Classe DatagramSocket
Recepção de dados via método receive
Método bloqueante sem prazo : pode ficar bloqueado um tempo
infinito se nenhum pacote é recebido.
Possibilidade de definir um prazo máximo de espera.
public void setSoTimeout(int timeout)
throws SocketException
a chamada do método receive será bloqueante durante no máximo o
tempo timeout milisegundos.
o método receive termina de dois jeitos
retorna normalmente um pacote recebido em menos tempo do que
timeout
A exceção SocketTimeoutException é lançada para indicar que
perdeu o prazo antes receber um pacote. Essa exceção é uma sob
classe de IOException.
Denis Julien SISTEMAS DISTRIBUÍDOS 53 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java Exemplo Cliente
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
public class Cliente {
static String HOSTNAME = "192.168.25.12";
public static void main(String args[])
throws SocketException,
UnknownHostException, IOException {
Denis Julien SISTEMAS DISTRIBUÍDOS 54 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java Exemplo Cliente
// definir o endereço do servidor
System.out.println("inicialização...");
// construção do endereço do servidor
InetAddress servidorEnder = InetAddress.getByName(HOSTNAME);
// inicializa os dados da mensagem
byte[] mensagem =
"Bom diaaaaaaaaaaaaaaaaaaaaaaaaa!".getBytes();
// inicializa um datagram com dados e destintário
DatagramPacket pacote = new DatagramPacket(mensagem,
mensagem.length, servidorEnder, 7777);
// abrir seu socket cliente.
DatagramSocket mysocket = new DatagramSocket();
Denis Julien SISTEMAS DISTRIBUÍDOS 55 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java Exemplo Cliente
// mandar os dados
System.out.println("Envio da mensagem para " + HOSTNAME);
mysocket.send(pacote);
// esperar o reconhecimento do servidor
mysocket.setSoTimeout(10000);// esperando 10 segundos
System.out.println("esperando reconhecimento
servidor máximo 10 segundos......");
Denis Julien SISTEMAS DISTRIBUÍDOS 56 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java Exemplo Cliente
try {
mysocket.receive(pacote);
String reconhecimento = new String(pacote.getData(),
0, pacote.getLength());
System.out.println("pacote recebido:" + reconhecimento +
" do cliente "
+ pacote.getAddress().getHostName() + ":" +
pacote.getPort());
} catch (SocketTimeoutException ex) {
System.out.println("Tempo de espera esgotado. Saindo.");
}
}
}
Denis Julien SISTEMAS DISTRIBUÍDOS 57 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java Exemplo Servidor
import java.io.IOException;
import java.net.DatagramPacket ;
import java.net.DatagramSocket ;
import java.net.SocketException;
public class Server {
public static void main( String args[])
throws SocketException, IOException{
Denis Julien SISTEMAS DISTRIBUÍDOS 58 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java Exemplo Servidor
// O servidor está escutando na porta 7777
// esperando o datagrama do cliente
// assim que ele recebe o pacote ele
// manda um reconhecimento para o cliente.
byte[] rbuf = new byte[256] ;
DatagramPacket pacote = new DatagramPacket(rbuf, rbuf.length) ;
DatagramSocket socket = new DatagramSocket(7777) ;
// espera em recepção
System.out.println("esperando cliente......");
socket.receive(pacote);
Denis Julien SISTEMAS DISTRIBUÍDOS 59 / 80
Sockets UDP Sockets UDP em Java
Socket UDP em Java Exemplo Servidor
String mensagem = new String(pacote.getData(),0,
pacote.getLength()) ;
System.out.println("pacote recebido:"+
mensagem+ " do cliente "+
pacote.getAddress().getHostName()+":"+pacote.getPort());
// mandar o reconhecimento ao cliente cujo
// enderço estão no pacote recebido
String reconhecimento = "recebido" ;
pacote.setData(reconhecimento.getBytes());
pacote.setLength(reconhecimento.length());
socket.send(pacote);
socket.close();
}
}
Denis Julien SISTEMAS DISTRIBUÍDOS 60 / 80
Sockets TCP
Socket TCP : princípios
Funcionamento em modo conectado
fase de conexão explícita entre o cliente e o servidor
dados enviados no canal e não por pacotes : fluxo virtual de dados
confiável: a camada TCP garante :
os dados enviados são recebidos pela aplicação destinatária na ordem
de envio
se perdas de pacote ⇒ reenvios até recepção
Denis Julien SISTEMAS DISTRIBUÍDOS 61 / 80
Sockets TCP
Socket TCP : princípios
Princípios de comunicação
O servidor liga um socket de escuta numa certa porta e espera uma
conexão de um cliente
o cliente cria um socket ligado a uma porta qualquer (aleatória mas
livre) para abrir uma conexão com o servidor no socket de escuta.
do lado do servidor, o serviço de espera de conexão retorna um socket
de serviço (associado a uma porta aleatoriamente escolhida)
é o socket que permite dialogar com o cliente
tem um socket diferente a cada cliente conectado
o cliente e o servidor mandam dados pelos sockets.
Denis Julien SISTEMAS DISTRIBUÍDOS 62 / 80
Sockets TCP
Socket TCP : princípios
Denis Julien SISTEMAS DISTRIBUÍDOS 63 / 80
Sockets TCP Sockets TCP em C
Socket TCP : programação em C
utiliza as mesma bases que para UDP
codificação dos identificadores: sockaddr_in, hostent, in_addr e
funcões associadas
gereciamento de sockets: socket() e descriptor de arquivos
necessidades a mais do que UDP
funções para esperar conexões do lado do servidor
funções para se conectar ao socket de escuta do servidor do lado do
cliente
Comunicação entre cliente/servidor após a fase de conexão
não precisa identificador do lado cliente pois funciona em modo
conectado: não usa recvfrom() ou sendto()
utiliza sim as funções sistema read() e write()
Denis Julien SISTEMAS DISTRIBUÍDOS 64 / 80
Sockets TCP Sockets TCP em C
Socket TCP : programação em C - conexão
do lado servidor: Espera da conexão
Função que espera a conexão de um cliente num socket de escuta
arquivo <sys/socket.h>
int accept(int socket_escuta,
struct socaddr * addr_cliente,
int * comp_addr) ;
parâmetros:
socket_escuta:o socket de escuta (a ligar sobre uma porta precisa)
addr_cliente :conterá o ednereço do cliente que vai se conectar:
tem que inicializar antes de usar a func ção recvfrom
comp_addr: tamanho da estrutura de endereço: tem que inicializar
antes de usar a função recvfrom
Retorna um descriptor de socket: que é o socket de serviço que
permite se comunicar com o cliente. Retorna −1 em caso de erro.
função bloqueante até a chegada da conexão.
Denis Julien SISTEMAS DISTRIBUÍDOS 65 / 80
Sockets TCP Sockets TCP em C
Socket TCP : programação em C - inicialização
do lado servidor: inicialização de conexões
Função par configurar o número máximo de conexões em espera
Número máximo de conexões em espera de um accept a um instante
dado (uma vez atingindo, outras conexões são recusadas)
int listen(int descriptor,
int num_con_emespera);
Parâmetros :
descriptor:descrição do socket de escuta a configurar
num_con_emespera: número máximo de conexões em espera
autorizadas
Retorn 0 se execução correta, −1 se não.
o número de conexões em espera definido deve ser menor do que o
valor da constante SOMAXCONN(arquivo <sys/socket.h>)
esse valor depende do sistema operacional
SOMAXCONN=128 para linux.
Função a chamar antes de fazer os accept
Denis Julien SISTEMAS DISTRIBUÍDOS 66 / 80
Sockets TCP Sockets TCP em C
Socket TCP : programação em C - abertura conexão
do lado do cliente :
Função para abrir uma conexão com a parte servidor
in connect(int descriptor,
struct sockaddr * addr_servidor,
int comp_addr) ;
Parâmetros:
descriptor: descrição do socket lado cliente
addr_servidor : identificador do socket de escuta do lado servidor
comp_addr: tamanho do endereço usado
Retorna 0 se OK, −1 se não
Função bloqueante se o servidor não faz o accept do seu lado.
Denis Julien SISTEMAS DISTRIBUÍDOS 67 / 80
Sockets TCP Sockets TCP em C
Socket TCP : programação em C - envio / recepção dados
Se conexão estabelecida
canal de comunicação direto entre socket cliente e socket servidor
não precisa dar o endereço do destinatário a cada envio de dados nem
verfificar o remetente a recepção.
Funções de comunicação
pode-se utilizar as funções padrão para comunicar : read (recepção) e
write (envio)
se quiser gerenciar algumas opções,funções especializadas send e recv
Denis Julien SISTEMAS DISTRIBUÍDOS 68 / 80
Sockets TCP Sockets TCP em C
Socket TCP : programação em C - Emissão
2 funções para emitir dados
ssize_t write(int descriptor,
void *ptr_mem,
size_t comprimento) ;
ssize_t send(int descriptor,
void *ptr_mem,
size_t comprimento,
int option) ;
Parâmetros:
descriptor : descrição do socket
prt_mem:zona memória onde estão os dados a enviar
comprimento: número de byte a enviar
option: 0 se envio normal ou MSG_OOB se envio de dados prioritários
Retorna o número de bytes mandados ou −1 em caso de pb.
Denis Julien SISTEMAS DISTRIBUÍDOS 69 / 80
Sockets TCP Sockets TCP em C
Socket TCP : programação em C - Recepção
2 funções para receber dados
ssize_t read(int descriptor,
void *ptr_mem,
size_t comprimento) ;
ssize_t recv(int descriptor,
void *ptr_mem,
size_t comprimento,
int option) ;
Parâmetros:
descriptor : descrição do socket
prt_mem:zona memória onde estarão escritos os dados recebidos
comprimento: número de byte a enviar
option: 3 valores possíveis:
0: recepção normal
MSG_OOB: recepção de dados prioritários
MSG_PEEK: leitura de dados recebidos mas sem tirar do buffer
Retorna o número de bytes recebidos ou −1 em caso de pb.
Denis Julien SISTEMAS DISTRIBUÍDOS 70 / 80
Sockets TCP Sockets TCP em Java
socket TCP em Java
SOCKET TCP EM JAVA
Denis Julien SISTEMAS DISTRIBUÍDOS 71 / 80
Sockets TCP Sockets TCP em Java
socket TCP em Java
Respeita o funcionamento básico dos sockets TCP.
modo conectado : conexão explícita ao servidor
comunicação confiável.
particularidade em relação com sockets UDP em Java:
os dados trocados : Objetos (utilização de cast em recepção).
usa-se os fluxos Java (Stream)
todo socket tem um fluxo de entrada e um fluxo de saída
comunicação de alto nível permitindo envia ou receber facilmente
qualquer objeto ou dados via os sockets
Denis Julien SISTEMAS DISTRIBUÍDOS 72 / 80
Sockets TCP Sockets TCP em Java
socket TCP em Java
Classes do package java.net utilizadas para comunicar via TCP
a classe InetAddress: codificação dos endereços IP (mesmo uso que
UDP)
a classe Socket: socket em modo conectado
a classe ServerSocket: socket de espera de conexão do lado servidor
Denis Julien SISTEMAS DISTRIBUÍDOS 73 / 80
Sockets TCP Sockets TCP em Java
socket modo conectado em Java
Classe Socket ( socket modo conectado)
Construtores:
public Socket(InetAddress endereco, int porta)
throws IOException
Cria uma conexão com o servidor identificado por endereço e porta. O
programa recupera um socket local associado a uma porta local
escolhida pelo sistema operacional.
public Socket(String nomeServidor, int porta)
throws IOException, UnknownHostException
Mesma coisa que o primeiro construtor mas usando um nome para
identificar o servidor. Lança uma exceção se não resolver o nome do
servidor.
variante desses construtores permitindo de definir uma porta local.
Denis Julien SISTEMAS DISTRIBUÍDOS 74 / 80
Sockets TCP Sockets TCP em Java
socket modo conectado em Java
Classe Socket
Emissão/Recepção de mensagem:
OutputStream getOutputStream()
Retorna um fluxo de saídapermitindo enviar dados via o socket
InputStream getInputStream()
Retorna um fluxo de entrada permitindo receber dados via o socket
Fechamento de um socket:
public close()
Fecha o socket e corta a conexão que foi estabelecida previamente
com o servidor.
Denis Julien SISTEMAS DISTRIBUÍDOS 75 / 80
Sockets TCP Sockets TCP em Java
socket modo conectado em Java
Classe Socket
Métodos get:
int getPort()
Retorna a porta remota com a qual o socket está conectado
InetAddress getAddress()
Retorna o endereço IP da máquina remota.
int getLocalPort()
Retorna a porta local com a qual o socket está associado
public void setSoTimeout(int timeout)
throws SocketException
posiciona a espera máxima em recepção de dados no fluxo de entrada do socket.
se o tempo está ultrapassado : exceção lançada SocketTimeoutException
default : tempo infinito em leitura no fluxo
Denis Julien SISTEMAS DISTRIBUÍDOS 76 / 80
Sockets TCP Sockets TCP em Java
socket Servidor em Java
Classe ServerSocket : socket de espera de conexão dos clientes, exclusivo
ao servidor.
Construtor:
public ServerSocket(int porta)
throws IOException
Cria um socket de escuta. O socket está ligado à porta definida pelo
programa. Uma exceção é lançada se a porta tiver já ligada a outro
socket.
Denis Julien SISTEMAS DISTRIBUÍDOS 77 / 80
Sockets TCP Sockets TCP em Java
socket Servidor em Java
Classe ServerSocket : socket de espera de conexão dos clientes, exclusivo
ao servidor.
Métodos:
Socket accept() throws IOException
Espera de conexão de um cliente remoto. Quando a conexão está
realizada, retorna um socket permitindo comunicar com o cliente
(socket de serviço)
void setSoTimeout(int tiemout)
throws SocketException
posiciona a espera máxima em recepção de dados no fluxo de entrada
do socket.
se o tempo está ultrapassado : exceção lançada
SocketTimeoutException
default : tempo infinito em espera de conexão
Denis Julien SISTEMAS DISTRIBUÍDOS 78 / 80
Sockets TCP Sockets TCP em Java
Denis Julien SISTEMAS DISTRIBUÍDOS 79 / 80
Multicast UDP/IP
Denis Julien SISTEMAS DISTRIBUÍDOS 80 / 80
	Apresentação geral dos sockets
	Sockets UDP
	Sockets UDP em C
	Sockets UDP em Java
	Sockets TCP 
	Sockets TCP em C
	Sockets TCP em Java
	Multicast UDP/IP

Continue navegando