Programa de Computador que funciona em Rede professor Robinson Vida Noronha 1
Paradigma Um programa rodando em rede é como uma loja. 2
Uma loja é composta por Vendedores Vendedores 3
Um loja deve servir a clientes Cliente 4
Para cada cliente que entrar na loja, um vendedor deverá atende-lo(a). 5
Cliente e Vendedor trocam informações o tempo todo. Ola,... 6
Como representar o Cliente? O Cliente é representado pela classe java.net.socket java.net.socket 7
Como representar a conversa entre o Cliente e o Vendedor? java.io.objectoutputstream: escreve na stream de saída. java.io.objectinputstream: le da stream de entrada. O que pode ser escrito? Dados primitivos e objetos Java. 8
Exemplo de Uso do Socket - Cliente private Socket con ; private ObjectOutputStream output; private ObjectInputStream input; private String endereco = 127.0.0.1 try con = new Socket(endereco,porta ); output = new ObjectOutputStream(con.getOutputStream()); InputStream s = con.getinputstream(); input = new ObjectInputStream(s); catch(java.io.ioexception er1) System.out.println(er1.getMessage()); 9
Como o Cliente ouve mensagens? try String mens = (String)input.readObject(); catch (java.lang.classnotfoundexception e) System.out.println("Class not found. \n"+ e.getmessage()); catch (java.io.ioexception e) System.out.println("Erro de IO. \n"+ e.getmessage()); 10
Como o Cliente ouve instâncias de Classe? try MinhaClasse mens = (MinhaClasse)input.readObject(); catch (java.lang.classnotfoundexception e) System.out.println("Class not found. \n"+ e.getmessage()); catch (java.io.ioexception e) System.out.println("Erro de IO. \n"+ e.getmessage()); 11
Como o Cliente fala mensagens? public void senddata(string m) try output.writeobject(m); output.flush(); // limpa o buffer. catch (IOException e) System.out.println( "Nao foi possivel enviar os dados.\n" + e.getmessage()); 12
Como é a dinamica do Cliente? O Cliente deverás ser filho de Thread ou implementar a interface Runnable Implementar o método ( void run( ) ) e todo o processo ocorre dentro desse método. 13
Implementação do Cliente public class ConversaComServidor implements Runnable private Socket con ; private ObjectOutputStream output; private ObjectInputStream input; private int p; // porta a ser conectado. private boolean ligado = true; private Protocolo protocolo; public ConversaComServidor(String endereco, int porta, Protocolo prot) p = porta; protocolo = prot; try con = new Socket(InetAddress.getByName(endereco),porta );... output = new ObjectOutputStream(con.getOutputStream()); InputStream s = con.getinputstream(); input = new ObjectInputStream(s); catch(java.io.ioexception er1) System.out.println (er1.getmessage()); 14
Implementação do Cliente: ouvidor public void run() String texto="", mens=""; while(ligado) try!mens = (String)input.readObject(); // li algo do servidor. if (mens.length() > 1) protocolo.analisemensagem(mens); if (protocolo.hasinstruction() ) senddata(protocolo.getmessage()); mens="";texto=""; catch (java.io.optionaldataexception e) System.out.println("Erro no desconectar.\n" +e.getmessage());... catch (java.lang.classnotfoundexception e) System.out.println("Class not found. \n" + e.getmessage()); catch (java.io.ioexception e) System.out.println("Erro de IO. \n"+ e.getmessage()); /* fim do while */ 15
Implementação do Cliente: envio de dados... public void senddata(string m) try output.writeobject(m); output.flush(); // limpa o buffer. catch (IOException e) System.out.println( "Nao foi possivel enviar os dados.\n" + e.getmessage()); public void setprotocoplo(protocolo p) protocolo = p; public void setstart(boolean v) ligado= v; // fim da classe public class Protocolo! public void analisemensagem(string m);! public boolean hasinstruction();! public String getmessage(); public boolean execute() return false; 16
public class ProtocoloSimples extends Protocolo private boolean doit = false; private String mensagem =, comando, mensagemderetorno;! public void analisemensagem(string mens) mensagem = ; if (mens.length() > 1) System.out.println("Recebi do servidor:"+mens); if (mens.lastindexof("[nome?]") > -1) comando = executar showinputdialog ; System.out.println("Pedido de indentificação feito pelo servidor."); if (mens.lastindexof("[exit]")>-1) System.exit(0); if (mensagem.length() > 0) doit = true; else doit = false;! public boolean hasinstruction() return doit;! public String getmessage() return mensagem; public boolean execute() if (doit) if (comando.equalsignorecase( executar showinputdialog ) ) mensagem = javax.swing.joptionpane.showinputdialog( Qual é o seu nome? ) ; return true; 17
Como representar o dono da loja? O Dono da Loja é representado pela classe java.net.serversocket java.net.serversocket 18
Dinamica da Loja O Dono da Loja fica monitorando a porta da loja. A cada cliente que entrar na loja, um Vendedor será enviado para atender esse cliente. Cada vendedor tem uma conversa privada com o seu respectivo cliente. Ao final da conversa, o vendedor não terá mais utilidade e será deletado. 19
As Classes Servidor e Vendedor 20
Início da Definição do Servidor ( Loja ) import java.io.*; import java.net.*; import java.util.*; public class Loja extends Thread!private int porta;!private ServerSocket donodalojinha;!private ObjectOutputStream output; /*fluxo de saida de dados.*/ private ObjectInputStream instream; /*fluxo de entrada de dados.*/ private Vector<Vendedor> listavendedor = new Vector<Vendedor>(); /*Vetor que guarda os vendedores */ private Vendedor vendedordavez;... 21
Abertura da Loja... public void conecta(int porta) /* armazena o numero da porta em uma variavel denomiada por "porta"!*/ this.porta = porta; try donodalojinha = new java.net.serversocket(porta); /* tenta se conectar com a porta.*/ catch(java.io.ioexception e)e.printstacktrace(); System.exit (1); System.out.println("A Loja estah aberta na porta " + porta + "!!"); public Loja(String n,int gate) setname(n); /*define, para o sistema operacional o nome do servico da thread*/ conecta(gate); 22
O Dono da Loja aguarda por clientes... public void run() while(true) try /* ServerSocket.accept() => espera por clientes. quando o cliente solicita conexao, uma instancia da classe Vendedor eh criada para representar essa conexao. */ vendedordavez =new Vendedor(donoDaLojinha.accept()); vendedordavez.start();/* thread do vendedor é disparada*/ addvendedor(vendedordavez); vendedordavez.informe( "Bem Vindo a porta : "+porta); vendedordavez.informe("[nome?]"); catch (java.io.ioexception e) // fim do while 23
Adiciona e Remove Vendedor private void removevendedor(vendedor j) listavendedor.remove(j); private void addvendedor (Vendedor j) listavendedor.add(j);! 24
A Representação do Vendedor (Classe Interna à Loja ) public class Loja extends Thread... class Vendedor extends Thread private ObjectOutputStream output; // fluxo de saida de dados. private ObjectInputStream instream;// fluxo de entrada de dados. private Socket connection; // armazena ponteiro para o servidor. private boolean noar=true; private String nome=""; // construtor da classe public Vendedor(Socket s) connection=s; // armazena a conexao com o servidor. try output = new ObjectOutputStream(s.getOutputStream()); // cria fluxo de saida de dados. instream = new ObjectInputStream(s.getInputStream()); // cria fluxo de entrada de dados. output.flush(); // limpa o Buffer. catch (IOException e)... 25
Dinâmica do Vendedor public void run() String fofoca; int x; while(noar) fofoca=ouvir(false); x = fofoca.indexof("bye"); // se o cliente enviou a instrucao para desconectar-se // do servidor, x armazenarah um valor superior a // (-1).! if ( x >= 0) this.noar=false;this.interrupt();! Loja.this.removeVendedor(this); System.out.println("Pedido de exclusão recebido!"); informe("[exit]"); // informa ao cliente que ele foi desconectado continue; /* busca por padrao do protocolo de comunicacao*/ informe( Eu terei o maior prazer em atende-lo(a) ); 26
Método de Envio de Mensagem do Vendedor para o Cliente private void informe(string m) try output.writeobject(m); output.flush(); catch (java.io.ioexception e)! System.out.println( "Erro de envio de mensagem"); this.closeconnection();! noar=false; // se um erro acontecer, entao desconectar o // Vendedor e desligar a Thread. 27
Método de Recebimento de Mensagem do Cliente para o Vendedor private String ouvir(boolean eco) String saida = new String(""); try saida = String.valueOf(inStream.readObject()); if (eco) System.out.println("ouvi " + saida); catch (IOException e ) System.out.println(e); catch (java.lang.classnotfoundexception clerr) System.out.println(clerr); catch (NullPointerException err)system.out.println(err);!! return saida;!! 28
O Cliente for embora. Hora de excluir o Vendedor. // rotina que permite retirar o Vendedor da lista // de Vendedores e desconectar o cliente do servidor. private void closeconnection() try! Loja.this.removeVendedor(this);! if (this.isalive())! this.interrupt();! // encerra a Thread. this.connection.close();!! catch (Exception exp) System.out.println("Cliente ausente"); // fim d classe vendedor. 29
Abertura da Loja public static void main(string[] a) Loja s = new Loja("Padaria",5555); s.start(); public class Cliente extends ConversaServidor public Cliente(int porta, Protocolo p) super("127.0.0.1",porta, p);! public static void main(string[] a)! Cliente c1 = new Cliente(5555, new ProtocoloSimples());! c1.start(); 30
Tarefa Adaptando o exemplo apresentado, você deverá criar uma aplicação cliente-servidora. O servidor terá a função de receber dois números inteiros e deverá retornar ao cliente a o resultado da soma desses dois números. 31