Baixe o app para aproveitar ainda mais
Prévia do material em texto
14/03/12 1 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia 2. Tecnologias de programação em sistemas distribuídos 2.1 Programação baseada em troca de mensagens 2.2 Chamada de procedimentos remotos (RPC) 2.3 Invocação de métodos remotos (RMI) 2.4 Padronização para objetos distribuídos – Corba Tema da aula 14/03/12 2 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Socket é uma tecnologia que possibilita a comunicação entre aplicações usando a rede de computadores; o O JAVA oferece os seguintes os seguintes modos: o TCP – modo orientado a conexão o UDP – modo orientado a datagrama o Os dois modos funcionam sobre o protocolo IP Introdução Socket INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Socket 14/03/12 3 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o O processo de comunicação é orientado a conexão; o Processo: o O servidor escolhe uma determinada porta o O servidor fica aguardando conexões nessa porta o O cliente deve saber previamente qual é a máquina servidor e a porta o O cliente solicita a conexão com a máquina/porta Sockets usando TCP/IP INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Se nenhum problema acontecer então irá estabelecer a comunicação Sockets usando TCP/IP 14/03/12 4 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o O comportamento do servidor é ficar em um loop aguardando novas conexões gerando sockets para atender as solicitações dos clientes Sockets usando TCP/IP INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando TCP/IP 14/03/12 5 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Para implementar a estrutura de cliente/servidor uHlizando o Java, este existe uma biblioteca para trabalhar com essa estruturas. Portanto para usá-‐las basta importar para o projeto; o Prá?ca 01 o Criar um projeto usando o NetBeans o Criar uma Classe e nomeá-‐la de Cliente o Criar uma Classe e nomeá-‐la de Servidor o Importar a classe java.net.* para a classe cliente e servidor; o Importar a classe java.io.* para a classe cliente e servidor; Sockets usando TCP/IP INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando TCP/IP o Implementação do cliente: o Especificar qual máquina o cliente conectará em qual porta o Criar um canal para enviar os dados o Criar um canal para receber os dados o Funcionalidades do programa Socket s = new Socket("localhost",2000);! DataInputStream entrada = new ! DataInputStream(s.getInputStream());! !! DataOutputStream saida = new ! DataOutputStream(s.getOutputStream());! 14/03/12 6 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando TCP/IP o Implementação do cliente: o Funcionalidades do programa o Finalizar conexão com o servidor fichar o canal de comunicação for (int i = 0; i < 10; i++){! saida.writeInt(i);! System.out.println("Enviei: "+i);! String en = entrada.readUTF();! System.out.println("Recebi: "+en);! }! entrada.close();! saida.close();! ! s.close();! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Implementação do servidor: o Especificar qual porta o servidor ficará escutando o Se aparecer alguma conexão deverá aceitar o Criar um canal para receber os dados o Criar um canal para enviar os dados Sockets usando TCP/IP ServerSocket s = new ServerSocket(2000);! System.out.println("Esperando conexao...............");! ! conexao = s.accept();! System.out.println("Conexao aceita, esperando dados...");! DataOutputStream saida = new ! DataOutputStream(conexao.getOutputStream());! DataInputStream entrada = new ! DataInputStream(conexao.getInputStream());! !! 14/03/12 7 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Implementação do servidor VERSÃO 01: o Fica recebendo os dados enviados pelo cliente Sockets usando TCP/IP for (int i = 0; i < 10; i++) {! int linha = entrada.readInt(); ! System.out.println("entrei");! saida.writeUTF("recebi seu dado: " + linha);! }! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Problemas do servidor: Sockets usando TCP/IP • O servidor aceita somente uma conexão por vez;! • O servidor não gera um loop infinito;! • Não temos dados dos clientes no servidor para gerar ! relatório! 14/03/12 8 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Implementação do servidor VERSÃO 02: o Fica recebendo os dados enviados pelo cliente Sockets usando TCP/IP InetAddress endereco_remoto;! int porta_remota;! ServerSocket s = new ServerSocket(2000);! System.out.println("Esperando conexao.......................");! conexao = s.accept();! System.out.println("Conexao aceita, esperando envio de dados.");! endereco_remoto = conexao.getInetAddress();! porta_remota = conexao.getPort();! ! System.out.println("Nome da maquina remota: " + ! endereco_remoto.getHostName());! System.out.println("IP da maquina remota: " + ! endereco_remoto.getHostAddress());! System.out.println("Porta maquina remota: " + porta_remota);! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Implementação do servidor VERSÃO 02: o Fica recebendo os dados enviados pelo cliente Sockets usando TCP/IP DataInputStream entrada = new DataInputStream(! conexao.getInputStream());! DataOutputStream saida = new DataOutputStream(! conexao.getOutputStream());! ! for (int i = 0; i < 10; i++) {! int linha = entrada.readInt();! System.out.println("entrei");! saida.writeUTF("recebi seu dado: " + linha);! }! 14/03/12 9 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Problemas do servidor: Sockets usando TCP/IP • O servidor aceita somente uma conexão por vez;! • O servidor não gera um loop infinito;! • Temos dados dos clientes no servidor para gerar ! relatório! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando TCP/IP • PráHca 02 -‐ CLIENTE public static void main(String args[]) {! try {! ! Socket conexao = new Socket("127.0.0.1", 2001);! ! DataInputStream entrada = new DataInputStream(! conexao.getInputStream());! DataOutputStream saida = new DataOutputStream(!conexao.getOutputStream()); ! String linha;! BufferedReader teclado = new BufferedReader(new ! ! ! ! !InputStreamReader(System.in));! !while (true) {! ! ! System.out.print("> ");! linha = JO….;! saida.writeUTF(linha);! linha = entrada.readUTF();! ! 14/03/12 10 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando TCP/IP • PráHca 02 -‐ CLIENTE ! ! if (linha.equalsIgnoreCase("")) {! System.out.println("Conecao encerrada!");! break;! }! System.out.println(linha);! }! }! catch (IOException e) {! System.out.println("IOException: " + e);! }! }! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando TCP/IP • PráHca 02 -‐ SERVIDOR public static void main(String args[]) {! try {! ! ServerSocket s = new ServerSocket(2001);! while (true) {! System.out.print("Esperando alguem se conectar...");! Socket conexao = s.accept();! System.out.println(" Conectou!");! DataInputStream entrada = new DataInputStream! (conexao.getInputStream());! ! DataOutputStream saida = new DataOutputStream! (conexao.getOutputStream());! ! ! ! String linha = entrada.readLine();! ! ! ! while (linha != null && !(linha.trim().equals(""))) {! saida.writeUTF(linha);! linha = entrada.readUTF();! ! 14/03/12 11 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando TCP/IP • PráHca 02 -‐ SERVIDOR ! ! }! ! ! saida.writeUTF(linha);! conexao.close();! }! }! catch (IOException e) {! System.out.println("IOException: " + e);! }! }! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Problemas do servidor: Sockets usando TCP/IP • O servidor aceita somente uma conexão por vez;! • O servidor gera um loop infinito;! • Temos dados dos clientes no servidor para gerar ! relatório! 14/03/12 12 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia • APLICAÇÃO CLIENTE Exemplos Threads Java import java.io.*;! import java.net.*;! ! public class Cliente extends Thread{! !! !private static boolean done = false;! !private Socket conexao;! !! !public Cliente(Socket s){! ! !conexao = s;! !}! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Exemplos Threads Java public static void main(String[] args) {! !try{! ! !Socket conexao = new Socket(”localhost",2000);! ! !PrintStream saida = new PrintStream! ! ! ! !(conexao.getOutputStream());! ! ! !! ! !BufferedReader teclado = new BufferedReader(new ! ! ! ! !InputStreamReader(System.in));! ! !System.out.print("Entre com o seu nome: "); ! ! !String meuNome = teclado.readLine(); ! ! !saida.println(meuNome); ! ! !Thread t = new Cliente(conexao);! ! !t.start(); ! ! !! ! !String linha;! ! !! 14/03/12 13 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Exemplos Threads Java ! !while (true){! ! ! !if (done){! ! ! ! break; ! ! ! ! !! ! ! !} ! ! !! ! ! !System.out.println("> "); ! ! ! ! linha = teclado.readLine(); ! ! ! !saida.println(linha); ! ! ! !! ! ! !! ! !}! ! !catch (IOException e){! ! ! !System.out.println("IOException: " + e);! ! !} ! !! !}! ! ! !! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Exemplos Threads Java public void run(){! try{! !BufferedReader entrada = new BufferedReader(new ! ! ! !InputStreamReader(conexao.getInputStream()));! !String linha;! !while (true){! ! !linha = entrada.readLine();! ! !if (linha.trim().equals("")){! ! ! !System.out.println("Conexao encerrada!!!");! ! ! !break;! ! !}! ! !System.out.println();! ! System.out.println(linha);! ! System.out.print("...> ");! !}! }! catch(IOException e){ ! !! !System.out.println("IOException: " + e);! }! done = true;! }! ! !! 14/03/12 14 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia • APLICAÇÃO SERVIDOR Exemplos Threads Java import java.io.*;! import java.net.*;! import java.util.*;! ! public class Servidor extends Thread {! ! !private static Vector clientes;! !private Socket conexao;! !private String meuNome;! ! !public Servidor(Socket s){! ! !conexao = s;! !}! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Exemplos Threads Java public static void main(String[] args) {! !clientes = new Vector();! !try{! ! !ServerSocket s = new ServerSocket(2000);! ! !while (true){! ! ! !System.out.print("Esperando conectar...");! ! ! !Socket conexao = s.accept();! ! ! !System.out.println(" Conectou!");! ! ! !Thread t = new Servidor(conexao);! ! ! !t.start();! ! !}! !}! !catch(IOException e){! ! !System.out.println("IOException: " + e);! !}! }! 14/03/12 15 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Exemplos Threads Java public void run(){! try{! !BufferedReader entrada = new BufferedReader(new ! InputStreamReader(conexao.getInputStream()));! !PrintStream saida = new PrintStream! (conexao.getOutputStream());! ! !meuNome = entrada.readLine();! !if (meuNome == null){! ! return;! !}! !clientes.add(saida);! !String linha = entrada.readLine();! ! !while ((linha != null) && (!linha.trim().equals(""))){! ! sendToAll(saida," disse: ",linha);! ! linha = entrada.readLine();! !}! ! ! !! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Exemplos Threads Java !sendToAll(saida," saiu "," do Chat!");! !clientes.remove(saida);! !conexao.close();! }! catch(IOException e){! !System.out.println("IOException: " + e);! }! }! ! ! !! 14/03/12 16 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Exemplos Threads Java public void sendToAll(PrintStream saida, String acao, String linha) throws IOException {! !Enumeration e = clientes.elements();! !while (e.hasMoreElements()) {! ! PrintStream chat = (PrintStream) e.nextElement(); ! if (chat != saida) {! ! !chat.println(meuNome + acao + linha);! ! }! ! if(acao == " saiu "){! ! if (chat == saida)! ! ! chat.println("");! ! }! }! } ! ! !! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Problemas do servidor: Sockets usando TCP/IP • O servidor aceita várias conexões;! • O servidor gera um loop infinito;! • Temos dados dos clientes no servidor para gerar ! relatório! 14/03/12 17 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Para o ulHmo exemplo feito em Java usando Threads colocar uma interface gráfica para deixar o exemplo mais fácil de uHlizar. o O trabalho será apresentado para o professor da disciplina o Grupos de 3 alunos o Valor do projeto 3 pontos o Data de entrega: ___________________ Projeto 01: projeto de TCP/IP INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Sockets usando UDP 14/03/12 18 INSTITUTO FEDERALTRIÂNGULO MINEIRO Campus Uberlândia o São muito mais rápidos que o TCP; o São muito mais simples; o Menos confiáveis; o Não temos estabelecimentos de conexão; o Comunicação ocorre apenas com o envio de mensagens; Sockets usando UDP/IP INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Uma mensagem é um datagrama; o Composto por um sender; o Um destinatário o Um receptor; o Uma mensagem; o Caso o destinatário não esteja aguardando uma mensagem a mesma é perdida Sockets usando UDP/IP 14/03/12 19 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Cliente: o criar um datagrama e informar qual o endereço do servidor o Habilitar que o usuário entre com dados Sockets usando UDP/IP DatagramSocket s = new DatagramSocket();! InetAddress sender = InetAddress.getByName("localhost");! String envio;! ! BufferedReader teclado = new BufferedReader(new ! InputStreamReader(System.in));! System.out.print("> ");! envio = teclado.readLine();! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Cliente: o Enquanto o usuário quiser enviar dados aceitar: o Criar o buffer o Montar o pacote de envio o Enviar Sockets usando UDP/IP while(!envio.equalsIgnoreCase("")){! byte[] buffer = envio.getBytes();! DatagramPacket pergunta = new DatagramPacket(buffer, ! buffer.length, sender, 4545);! s.send(pergunta);! 14/03/12 20 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Cliente: o Enquanto o usuário quiser enviar dados aceitar: o Montar o pacote para receber o Receber o Mostra para o usuário a resposta Sockets usando UDP/IP DatagramPacket resposta = new ! DatagramPacket(new byte[512], 512);! s.receive(resposta);! for(int i = 0; i < resposta.getLength(); i++){! System.out.print((char) resposta.getData()[i]);! }! System.out.println();! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Cliente: o Enquanto o usuário quiser enviar dados aceitar: o Montar o pacote para receber o Receber o Mostra para o usuário a resposta Sockets usando UDP/IP DatagramPacket resposta = new ! DatagramPacket(new byte[512], 512);! s.receive(resposta);! for(int i = 0; i < resposta.getLength(); i++){! System.out.print((char) resposta.getData()[i]);! }! System.out.println();! 14/03/12 21 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Cliente: o Enquanto o usuário quiser enviar dados aceitar: o Esperar o usuário entrar com dados novamente o Fechar do datagrama Sockets usando UDP/IP System.out.print("> ");! envio = teclado.readLine();! s.close();! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Servidor: o Criar o datagrama em uma porta o Monta o pacote para receber os dados do cliente o Enquanto estiver recebendo os dados Sockets usando UDP/IP DatagramSocket s = new DatagramSocket(4545);! System.out.println("Servidor esperando conexão.......");! String envio;! DatagramPacket recebe = new ! DatagramPacket(new byte[512], 512);! while(true){! envio = "";! s.receive(recebe);! 14/03/12 22 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Servidor: o Recebe os dados e monta a resposta o Monta o buffer para o cliente e atribui ao datagrama e envia Sockets usando UDP/IP System.out.print("Mensagem recebida: ");! for(int i = 0; i < recebe.getLength(); i++){! System.out.print((char) recebe.getData()[i]);! envio = envio + (char) recebe.getData()[i];! }! System.out.println();! byte[] buffer = envio.getBytes();! DatagramPacket resp = new DatagramPacket(buffer, ! b u f f e r . l e n g t h , r e c e b e . g e t A d d r e s s ( ) , recebe.getPort());s.send(resp); ! }! INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia o Para o ulHmo exemplo feito em Java usando UDP colocar uma interface gráfica para deixar o exemplo mais fácil de uHlizar. o Além disso criar uma função no servidor que envia para todos os clientes conectados as mensagens enviadas simulando um chat. o O trabalho será apresentado para o professor da disciplina o Grupos de 3 alunos o Valor do projeto 4 pontos o Data de entrega: ___________________ Projeto 02: projeto de UDP/IP 14/03/12 23 INSTITUTO FEDERAL TRIÂNGULO MINEIRO Campus Uberlândia Fim aula..... ricardoboaventura@iftm.edu.br
Compartilhar