Comparativa I: Servidor en Java

Segunda entrega de esta comparativa. Le toca el turno al servidor echo. Este servidor constará de dos clases: EchoServer, la clase pública con el método main, y EchoConnection, que extiende la clase Thread y es la que realiza la mayor parte del trabajo.

EchoServer.

Aquí nos encontramos el método main(), el cual es muy, pero que muy simple:

public static final void main(String[] args){
new EchoServer();

}

El constructor de la clase es un poco más interesante, con él se explicará el funcionamiento básico de la clase ServerSocket del paquete java.net.

int port = 7777;
try{
ServerSocket server = new ServerSocket(port);
System.out.println("Servidor a la escucha en el puerto: "+port);

El constructor de la clase ServerSocket recibe como parámetro el número del puerto en el que ha de escuchar. En el siguiente trozo de código se crea un bucle infinito y se lanzan hilos que manejen las peticiones recibidas. Para ello se utiliza el método accept() de la clase ServerSocket. Este método espera una conexión y devuelve el objeto Socket que la representa. Finalmente se capturan las excepciones.
while(true) new EchoConnection(server.accept());
}catch(Exception e){
System.out.println("Error en el servidor.\n"+e.toString());
}

EchoConnection.

La clase EchoConnection extiende la clase Thread y contiene dos variables estáticas: connections y visits. Estas variables sirven para contabilizar el número de clientes totales y el de clientes conectados actualmente. Por otra parte, se declara una variable privada socket, en la que se almacena la conexión pasada al constructor. Dicho constructor, consta de la asignación del socket recibido al privado y de la sentencia que inicia el hilo (this.start()).

El último método a comentar es el método run(). Dicho método es rápido de explicar. En primer lugar, se aumenta el número de conectados y el de las visitas:

EchoConnection.connections++;
int numCliente = ++EchoConnection.visits;

Después se capturan los flujos de entrada y de salida:

BufferedReader entrada = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
PrintWriter salida = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true);

Ahora se ha de realizar lo que se supone que debe hacer. Recibir una cadena…

String cadena = entrada.readLine();

…y reenviarla:

salida.println(cadena);

Para terminar, se cierran los flujos y el socket:

entrada.close();
salida.close();
this.socket.close();

Después se capturan las excepciones y en el finally se resta 1 al número de conectados.

El código completo se puede encontrar aquí.

Nota: el código no es todo lo limpio que debería ser. Todos los cierres deberían ir en el finally, por ejemplo.

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 *