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 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 ([email protected]) o trabalho no dia 13/04; • Vale 3 pontos; • Não receberam pontos caso haja 2 ou mais trabalhos iguais;