package NClientServer; import java.io.* ; import java.net.* ; import java.util.* ; public class ConcurrentEchoClient2 { int port ; InetAddress server ; DatagramSocket socket ; // Guardar a localizacao do servidor... ConcurrentEchoClient2( InetAddress server, int port ) { this.server = server ; this.port = port ; } // Metodo que envia as mensagens lidas da consola void init() { try { socket = new DatagramSocket() ; new ReaderThread( socket ).start(); String request ; do { // Le uma mensagem da consola request = readLineFromConsole() ; // envia para o servidor o datagrama byte[] requestData = request.getBytes() ; DatagramPacket req = new DatagramPacket( requestData, requestData.length, server, port ) ; socket.send( req ) ; // testa se deve terminar. } while( ! request.equals("!fim")) ; } catch( IOException x ) {} } String readLineFromConsole() { return new Scanner( System.in ).nextLine() ; } public static void main(String[] args ) throws Exception { if( args.length != 2 ) { System.err.println("usage: java ConcurrentEchoClient maquina_do_servidor porto_do_servidor") ; System.exit(0) ; } int port = Integer.parseInt( args[1]) ; InetAddress server = InetAddress.getByName( args[0] ) ; new ConcurrentEchoClient2( server, port ).init() ; } } class ReaderThread extends Thread { DatagramSocket socket ; ReaderThread( DatagramSocket socket ) { this.socket = socket ; super.setDaemon( false ) ; // opcional } // Metodo onde corre o thread de leitura e que // afixa no terminal as mensagens ecoadas pelo servidor public void run() { for(;;) { try { // espera a chegada de um dagrama do servidor byte[] buf = new byte[65536] ; DatagramPacket datagram = new DatagramPacket( buf, buf.length ) ; socket.receive( datagram ) ; // afixa no terminal a mensagem de echo String msg = new String( datagram.getData(), 0, datagram.getLength() ) ; System.out.printf(">%s\n", msg ) ; } catch( IOException x) {} } } }