160 likes | 252 Views
Socket em Java. Servidor. import java.io.*; import java.net.*; public class Servidor { public static void main( String args[] ) throws Exception { //Escutar a porta 6789 ServerSocket server = new ServerSocket( 6789 ); //Espera uma conexão
E N D
Servidor import java.io.*; import java.net.*; public class Servidor { public static void main( String args[] ) throws Exception { //Escutar a porta 6789 ServerSocket server = new ServerSocket( 6789 ); //Espera uma conexão Socket cliente = server.accept(); // -------------------------- // RECEBE UM DADO DO CLIENTE InputStream input = cliente.getInputStream(); int valor = input.read(); // Mostrar o valor na tela System.out.println( "valor: " + valor ); //Fechar a conexão input.close(); cliente.close(); server.close(); } } Limitação: ele recebe apenas 1 cliente e depois para a conexão;
Cliente import java.io.*; import java.net.*; public class Cliente { public static void main( String args[] ) throws Exception { //Abrir a conexao com o servidor Socket socket = new Socket( "127.0.0.1" , 6789 ); // -------------------------- // ENVIAR UM DADO OutputStream output = socket.getOutputStream(); output.write( 127 ); //Fechar a conexão com o servidor output.close(); socket.close(); } }
1° melhoramento servidor pode receber mais clientes
Servidor public class Servidor{ Private static boolean executar = true; public static void main( String args[] ) throws Exception{ //Escutar a porta 6789 ServerSocket server = new ServerSocket( 6789 ); while( executar ){ //Espera uma conexão Socket cliente = server.accept(); // -------------------------- // RECEBE UM DADO DO CLIENTE InputStream input = cliente.getInputStream(); int valor = input.read(); //Mostrar o valor na tela System.out.println( "valor: " + valor ); //Fechar a conexão input.close(); cliente.close(); } server.close(); } } Limitação: ele recebe apenas 1 cliente por vez;
2° melhoramento servidor pode atender clientes simultaneamente
Servidor import java.net.*; import java.util.concurrent.*; public class Servidor{ Private static boolean executar = true; public static void main( String args[] ) throws Exception{ //Escutar a porta 6789 ServerSocket server = new ServerSocket( 6789 ); ExecutorService pool = Executors.newCachedThreadPool(); while( executar ){ //Espera uma conexão Socket cliente = server.accept(); //Atender o cliente em um Thread pool.submit( new AtenderClienteRunnable( cliente ) ); } server.close(); } }
Servidor( continuação... ) import java.io.InputStream; import java.net.Socket; public class AtenderClienteRunnable implements Runnable { private Socket cliente; public AtenderClienteRunnable(Socket cliente) { this.cliente = cliente; } @Override public void run() { Try { // -------------------------- // RECEBE UM DADO DO CLIENTE InputStream input = cliente.getInputStream(); int valor = input.read(); // Mostrar o valor na tela System.out.println( "valor: " + valor ); //Fechar a conexao com o cliente input.close(); cliente.close(); } catch(Exception err) { err.printStackTrace(); } } }
3° melhoramento Facilidades do Java
Facilidades • Utilizar o OutputStream e o InputStream é a maneira mais baixo nível de comunicação; • Enviar e receber bytes; • O java permite enviar e receber um objeto, de forma fácil e rápida; • Basta criar uma instancia do ObjectOuputStream e ObjectInputStream;
Servidor @Override public void run() { Try { // -------------------------- // RECEBE UM DADO DO CLIENTE InputStream input = cliente.getInputStream(); ObjectInputStream ois = new ObjectInputStream( input ); Protocolo protocolo = (Protocolo) ois.readObject(); // Mostrar o valor na tela System.out.println( protocolo.toString() ); System.out.println( "------------------" ); //Fechar a conexao com o cliente input.close(); cliente.close(); } catch(Exception err) { err.printStackTrace(); } }
Cliente public class ClienteObjeto { public static void main( String args[] ) throws Exception { //Abrir a conexao com o servidor Socket socket = new Socket( "127.0.0.1" , 6789 ); // -------------------------- // ENVIAR UM DADO OutputStream output = socket.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( output ); Protocolo protocolo = new Protocolo(); protocolo.setId( 1 ); protocolo.setMetodo( "somar" ); protocolo.setParam1( 10 ); protocolo.setParam2( 20 ); oos.writeObject( protocolo ); //Fechar a conexao com o servidor output.close(); socket.close(); } }
… onde eu quero chegar com isso: o cliente apenas envia e o servidor apenas recebe. Deste modo, o exercício de vocês é fazer com o que o cliente espere e mostre na tela a resposta do servidor.
Exercício • objetivo: Validar um CPF ou CNPJ no servidor • O cliente envia um CPF ou CNPJ para o servidor • O servidor recebe o dado, processa e retorna uma resposta • true: caso o CPF ou CNPJ seja válido • False: caso o CPF ou CNPJ seja inválido • O cliente deve mostrar a resposta na tela • O Servidor deve: • Receber vários clientes (use while logo após abrir a porta); • de forma simultânea (use Thread); • Se tiver código igual, nenhum dos grupos irá receber a nota;
Exercício • Adicionar ou modificar um objeto usuário no servidor • O cliente envia o objeto usuário e qual ação deve fazer • O servidor processa e retorna: • true: caso tenha feito com sucesso • False: caso acontecer alguma falha • O cliente deve esperar e imprimir na tela a resposta do servidor
Avisos • Em trio! • Devem enviar por e-mail (avld@cin.ufpe.br) o trabalho no dia 13/04; • Vale 3 pontos; • Não receberam pontos caso haja 2 ou mais trabalhos iguais;