Sistemas Distribuídos Aula 5 Msc. Daniele Carvalho Oliveira Doutoranda em Ciência da Computação - UFU Mestre em Ciência da Computação UFU Bacharel em Ciência da Computação - UFJF
Estrutura básica Uma aplicação que utiliza sockets normalmente é composta por uma parte servidora e diversos clientes. Um cliente solicita determinado serviço ao servidor, o servidor processa a solicitação e devolve a informação ao cliente
Sockets com TCP Quando é necessária a confirmação de recebimento da mensagem enviada, devemos utilizar o protocolo TCP (Transmission Control Protocol) A programação do TCP com sockets utiliza streams, o que simplifica muito o processe de leitura e envio de dados pela rede. Streams são objetos Java que permitem obter dados de qualquer fonte de entrada, seja o teclado, um arquivo ou até mesmo um fluxo de bytes recebidos pela rede
Primeiro Servidor TCP Nosso primeiro servidor permitirá a seus clientes solicitarem a data e a hora atuais. Com limitação.
Passo a Passo Ao ser iniciado o servidor fica ouvindo na porta 12345 a espera de conexões de clientes; O cliente solicita uma conexão ao servidor; O servidor exibe uma mensagem na tela com o endereço IP do cliente conectado; O servidor aceita a conexão e envia um objeto Date ao cliente; O cliente recebe o objeto do servidor e faz o tratamento necessário, em seguida exibe na tela as informações de data; O servidor encerra a conexão.
public class ServidorTCPBasico { public static void main(string[] args) { try { ServerSocket servidor = new ServerSocket(12345); System.out.println("Servidor ouvindo a porta 12345"); while(true) { Socket cliente = servidor.accept(); System.out.println("Cliente conectado: " + cliente.getinetaddress().gethostaddress()); ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream()); saida.flush(); saida.writeobject(new Date()); saida.close(); cliente.close(); } } catch(exception e) { System.out.println("Erro: " + e.getmessage()); } }}
Cliente TCP public class ClienteTCPBasico { public static void main(string[] args) { try { Socket cliente = new Socket( daniele",12345); ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream()); Date data_atual = (Date)entrada.readObject(); JOptionPane.showMessageDialog(null,"Data recebida + data_atual.tostring()); entrada.close(); System.out.println("Conexão encerrada"); } catch(exception e) { System.out.println("Erro: " + e.getmessage()); } } } do servidor:"
Sockets com UDP Quando necessitamos de uma troca não confiável de informações podemos usar o protocolo UDP O UDP utiliza datagram sockets para a troca de mensagens. As principais aplicações do UDP são aplicações como transmissões de vídeo, skype, voip, etc...
Primeiro Servidor UDP Nosso servidor enviará mensagens para os clientes de uma determinada rede local
public class RemetenteUDP { public static void main(string[] args) { if(args.length!= 3) { System.out.println("Uso correto: <Nome da maquina> <Porta> <Mensagem>"); System.exit(0); } try { InetAddress addr = InetAddress.getByName(args[0]); int port = Integer.parseInt(args[1]); byte[] msg = args[2].getbytes(); DatagramPacket pkg = new DatagramPacket(msg,msg.length, addr, port); DatagramSocket ds = new DatagramSocket(); ds.send(pkg); System.out.println("Mensagem enviada para: " + addr.gethostaddress() + "\n" + "Porta: " + port + "\n" + "Mensagem: " + args[2]); ds.close(); } catch(ioexception ioe) {...} } }
Cliente UDP Os clientes aguardarão a mensagem enviada pelo servidor.
public class ReceptorUDP { public static void main(string[] args) { if(args.length!= 1) { System.out.println("Informe a porta a ser ouvida"); System.exit(0); } try { int port = Integer.parseInt(args[0]); DatagramSocket ds = new DatagramSocket(port); System.out.println("Ouvindo a porta: " + port); byte[] msg = new byte[256]; DatagramPacket pkg = new DatagramPacket(msg, msg.length); ds.receive(pkg); JOptionPane.showMessageDialog(null,new String(pkg.getData()).trim(), "Mensagem recebida",1); ds.close(); } catch(ioexception ioe) {...} }}
Um servidor TCP com múltiplos threads No primeiro exemplo de servidor TCP, o servidor processava uma conexão de cada vez.
TCP com multithreading O cliente solicita arquivos de imagem ao servidor O cliente deve informar o caminho do arquivo no servidor O servidor, ao receber o pedido, enviará o arquivo ao cliente Para cada solicitação o servidor criará uma nova thread para gerenciar a troca de novas mensagens
O cliente
O código do botão
Broadcast Broadcast significa enviar datagram sockets para todos os clientes conectados em uma determinada rede.
Multicast O multicast permite enviar datagramas para um grupo de clientes conectados na rede Os clientes interessados em receber estas mensagens devem participar de um grupo multicasting. O UDP suporta multicast
Multicast Os endereços reservados para o multicast estão entre 224.0.0.0 e 230.255.255.255 Sendo os endereços com prefixo 239 reservados para uso em intranets.
Um servidor e um cliente Multicast Neste exemplo: O cliente assina um grupo multicast, 239.0.0.1, a partir deste momento o cliente aguarda por mensagens do servidor; O servidor envia mensagens multicast para o grupo 239.0.0.1 O cliente recebe a mensagem e a exibe na tela
Servidor
Cliente
Fim da Aula 5. Sistemas Distribuídos: Msc. Daniele C. Oliveira 38