Mar 21 2009

Sockets en Java

Categoría: DAD,ProgramaciónMiguel Angel @ 10:00
Sockets en Java

Sockets en Java

Muchas veces utilizamos Internet sin conocer que sucede en las entrañas de la red. ¿Que ha pasado para que puedas ver esta página? ¿Como nos comunicamos con un servidor de FTP? ¿Como descargamos el correo? La respuesta es fácil, estableciendo un canal de comunicación entre nuestro ordenador y el servidor y siguiendo un protocolo que nos permita entendernos.

Pues ese canal de comunicación es lo que se conoce como Socket. Y cuya traducción al español sería: encaje, cuenca, órbita, alvéolo, foso o enchufe. A nivel tecnológico debemos de quedarnos con la última acepción. Así que, cuando pulsamos en conectar, nuestro cliente de FTP se enchufa con el servidor y empieza la comunicación entre ambos. Es importante saber que toda comunicación a través de la red se realiza siguiendo un orden y que para ello existe un documento donde se definen los pasos a dar. Este documento se conoce con el nombre de RFC y existen un montón, como mínimo uno por protocolo.

Pero en esta entrada no voy a hablar sobre un protocolo en concreto si no de cómo establecer este canal de comunicación entre el cliente y el servidor utilizando Java.

Como todo en Java, el canal de comunicación se representa mediante una clase y en este caso mediante la clase Socket. Es bastante difícil que dos ordenadores puedan conectarse a la vez por lo que es necesario que uno de ellos se ponga a la escucha y espere a que el otro se conecte. Bien, este ponerse a la escucha se implementa mediante la clase ServerSocket

ServerSocket ss = new ServerSocket(21)

Con esa sentencia he creado un objeto servidor que se pondrá a la escucha cuando se invoque la siguiente sentencia:

Socket servidor = ss.accept()

Es decir, desde ese momento el sistema operativo es informado de que hay un proceso que está a la escucha en el puerto 21. Así que, si llega una petición a dicho puerto se le debe comunicar. Una vez que dicha petición ha llegado continua con la ejecución devolviendo un objeto de la clase Socket y que representa el canal de comunicación con el cliente que ha hecho la petición.

Para que el cliente se conecte con el servidor sólo tendrá que hacer lo siguiente:

Sockect cliente = new Socket(ip,puerto)

A partir de este punto ya existe una comunicación, Socket, entre el cliente y el servidor. Ya sólo nos queda leer y escribir sobre dicho canal de comunicación. ¿Y como lo hacemos? Pues utilizando las clases que nos proporciona Java. Recuerda que un socket es un fichero del sistema operativo por lo que se deberá actuar de la misma forma que se hace al leer y escribir de un fichero: mediante flujos de lectura y escritura. Para leer utilizaremos la clase BufferedReader y para escribir PrintWritter. En el caso del servidor el código quedaría de la siguiente manera:

BufferedReader br = new BufferedReader(
	new InputStreamReader(servidor.getInputStream())
PrintWritter pw = new PrintWriter(
	new OutputStreamWriter(servidor.getOutputStream()))

Para crear el buffer de lectura le «pedimos» al socket que nos dé el flujo de entrada. Y para escribir sobre el socket le pedimos a este que nos dé el flujo de salida. En ambos casos utilizamos dos clases, InputStreamReader y OutputStreamReader, que necesarias en los constructores de BufferedReader y PrintWritter respectivamente.

Pues ya sólo nos queda leer y escribir, y esto se hace de la siguiente forma:

br.readLine()
pw.println()

En el primer caso se queda esperando hasta que en el buffer haya una linea y en el segundo escribe una linea en el socket. Es interesante vaciar el buffer de salida cada vez que escribimos, quedando la sentencia de la siguiente forma:

pw.println()
pw.flush()

Una vez que ya tenemos la conexión y sabemos leer y escribir sólo nos queda implementar el protocolo deseado; este puede ser uno inventado por nosotros o cualquiera de los que están definidos en los muchos RFCs existentes.

Poco más que decir… bueno que siempre hay que cerrar el socket haciendo uso del método close.

Etiquetas: , ,

Una respuesta a “Sockets en Java”

  1. Lorenzo dice:

    Una » clase » muy interesante y gráfica para entender cómo funciona la web y la forma de conectarnos o enchufarnos mediante los sockets.

Dejar una respuesta