Baixe o app para aproveitar ainda mais
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
Compartilhar