Comparativa I: Cliente en Java.

En primer lugar, decir que no es un cliente “echo”, simplemente es un programita que nos pruebe que el servidor, lo que realmente interesa.

El cliente en sí, es sencillo a más no poder: crea una cantidad de hilos cada uno de los cuales pilla un mensaje aleatorio, lo envía y comprueba que lo recibido es igual al enviado. Esto será así para el resto de lenguajes, por lo que no lo volveré a escribir (que me canso).

Empecemos a ver código. Una vista previa del código fuente (se puede descargar aquí) nos desvelará que consta de tres clases (sólo una de ellas es pública, por lo que sólo necesitaremos un archivo): EchoClient, EchoClientThread y Mensaje. Comentaremos primero las dos primeras, por ser las más cortas y después la segunda, por ser la que realiza todo el trabajo.

EchoClient.

La clase EchoClient es pública y consta de una variable estática (el límite de hilos), limite, y el método main. Dicho método sólo consta de una línea de código, la cual lanza tantos hilos como lo indique la variable estática:

for(int i=0; i < EchoClient.limite; i++) new EchoClientThread();

Mensaje.

La clase Mensaje sólo contiene un método estático:

public static String aleatorio(){
String[] mensajes = {"Hola, Mundo.","Melón.","Larga y próspera vida.","La Quinta Raza.","So long, and thanks for all the fish.","Spain is different.", "Com va això?","Bona tarda."};
return mensajes[ (int) Math.round(Math.floor(Math.random() * mensajes.length)) ];
}

En la primera línea se crea un array de String con diferentes mensajes. En el segundo se genera un número aleatorio y se coge ese elemento del array.

EchoClientThread.

Esta clase extiende de Thread. Su constructor simplemente llama al constructor padre e inicia el hilo. El método run() simplemente tiene un bucle infinito que llama una y otra vez el método conectar(). Este método es el interesante, aparte de largo, por lo que vayamos por partes:

int port = 7777;
String server = "localhost";

Declaramos dos variables, la primera es el puerto y la segunda el servidor al que nos conectaremos. Ahora entramos en un bloque try:

Socket s = new Socket(server,port);
BufferedReader entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter salida = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true);

Aquí creamos el socket al servidor y puerto indicados anteriormente. Después se capturan los flujos de entrada y de salida.

String mensaje = Mensaje.aleatorio();
salida.println(mensaje);

Creamos un mensaje aleatorio y se envía al servidor.

String cadena = entrada.readLine();
System.out.println(cadena.equals(mensaje));

Se recoge la respuesta del servidor y se imprime true si es lo enviado o false si es distinto. Por último se cierra la conexión:

s.close();

Y se capturan los errores. Técnicamente el último close() tendría que ir en un finally, etc. pero como ejemplo va bien. Ahora ya sólo se necesita compilarlo. Próximamente, el servidor.

Author: Serabe

Mathematician, and Ruby and JavaScript programmer. Sometimes I speak at conferences and local meetups.

Leave a Reply

Your email address will not be published. Required fields are marked *