package NClientServer; import java.io.*; import java.net.*; import java.util.*; public class MyConcurrentEchoClient implements Runnable { String clientName; int port; InetAddress server; DatagramSocket socket; // Guardar a localizao do servidor... MyConcurrentEchoClient(String clientName, InetAddress server, int port) { this.clientName = clientName; this.server = server; this.port = port; } // Mtodo 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 datagrama 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) { } } } // Mtodo principal do cliente // Depois das inicializaes envia as mensagens lidas da consola para o // servidor at o utilizador escrever "!fim" void doIt() { try { socket = new DatagramSocket(); // Cria um thread para fazer a leitura das mensagens do // servidor, enquanto o thread principal faz a leitura // das mensagens introduzidas na consola pelo utilizador Thread t = new Thread(this); t.setDaemon(true); // opcional... t.start(); // arranca com o thread, que corre no mtodo run() // Cria um objecto auxiliar para ler linhas completas do canal de // entrada standard Scanner in = new Scanner(System.in); String request; do { // L uma mensagem da consola request = in.nextLine(); String message = clientName + ": " + request; // envia para o servidor o datagrama byte[] messageData = message.getBytes(); DatagramPacket msg = new DatagramPacket(messageData, messageData.length, server, port); socket.send(msg); // testa se deve terminar. } while (!request.equals("!fim")); socket.close(); } catch (IOException x) { } } public static void main(String[] args) throws Exception { if (args.length != 3) { System.err.println("usage: java ConcurrentEchoClient nome_do_cliente maq_do_servidor porto_do_servidor"); System.exit(0); } String clientName = args[0]; int port = Integer.parseInt(args[2]); InetAddress server = InetAddress.getByName(args[1]); new MyConcurrentEchoClient(clientName, server, port).doIt(); } }