Está en la página 1de 7

PROGRAMACIN CLIENTE SERVIDOR El Cliente/Servidor es conocido para aplicaciones de red.

Es til para interactuar entre procesos simultneos, y se base en preguntas y repuestas, que asegura que si dos aplicaciones intentan comunicarse, una comienza la ejecucin y espera indefinidamente que la otra le responda y luego continua con el proceso. Componentes: Cliente: aplicacin que inicia la comunicacin, es dirigida por el usuario. Servidor: es quien responde a los requerimientos de los clientes, son procesos que se estn ejecutando indefinidamente. SOCKETS Los servidores tienen un socket relacionado a un nmero de puerto especfico. El servidor espera a la escucha en el socket a que un cliente se conecte con una peticin. El cliente conoce el nombre de la mquina sobre la que est ejecutndose el servidor y el nmero de puerto al que est conectado. Solicitar una conexin consiste en intentar establecer una cita con el servidor en el puerto de la mquina servidora. El servidor acepta la conexin si todo es bien. Pero antes, el servidor crea un nuevo socket en un puerto diferente. Es necesario crear un nuevo socket (y consecuentemente un nmero de puerto diferente) de forma que en el socket original se continua a la escucha de las peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectado. En el cliente, si se acepta la conexin, el socket se crea satisfactoriamente y se puede utilizar para comunicarse con el servidor. Los sockets siempre estn asociados a un nmero de puerto que es utilizado por TCP para identificar la aplicacin a la que est destinada la solicitud y poder redirigrsela. SOCKETS EN JAVA Java naci como lenguaje para la red y slo sucesivamente se convirti en un verdadero lenguaje de programacin, por ello se hace necesario proporcionar herramientas para acceder a distintos servicios de internet como por ejemplo un servidor web. Este es el contenido del paquete java.net de la plataforma Java que proporciona una clase Socket, la cual implementa una de las partes de la comunicacin bidireccional entre un programa Java y otro programa en la red. Usando la clase java.net.Socket en lugar de utilizar cdigo nativo de la plataforma, los programas Java pueden comunicarse a travs de la red de una forma totalmente independiente de la plataforma. Es el objeto bsico en toda comunicacin a travs de Internet, bajo el protocolo TCP. Esta clase proporciona mtodos para la entrada/salida a travs de streams que hacen la lectura y escritura a travs de sockets bastante simple.

De forma adicional, java.net incluye la clase ServerSocket, la cual implementa un socket el cual los servidores pueden utilizar para escuchar y aceptar peticiones de conexin de clientes. Es un objeto utilizado en las aplicaciones servidor para escuchar las peticiones que realicen los clientes conectados a ese servidor. Este objeto no realiza el servicio, sino que crea un objeto Socket en funcin del cliente para realizar toda la comunicacin a travs de l. LA CLASE SOCKET La clase Socket del paquete java.net es fcil de usar comparada con la que proporcionan otros lenguajes. Java oculta las complejidades derivadas del establecimiento de la conexin de red y del envo de datos a travs de ella. En esencia, el paquete java.net proporciona la misma interfaz de programacin que se utiliza cuando se trabaja con archivos. LA CLASE SERVERSOCKET La clase ServerSocket es la que se utiliza a la hora de crear servidores, al igual que como se ha visto, la clase Socket se utilizaba para crear clientes. ENVIO Y RECEPCIN A TRAVS DE SOCKETS El socket se abre en el Cliente de la siguiente manera: Socket miCliente; miCliente = new Socket( "maquina", numeroPuerto ); Donde maquina es el nombre de la mquina en donde estamos intentando abrir la conexin y numeroPuerto es el puerto (un nmero) del servidor que est corriendo sobre el cual nos queremos conectar. Cuando se selecciona un nmero de puerto, se debe tener en cuenta que los puertos en el rango 0-1023 estn reservados para usuarios con muchos privilegios (superusuarios o root). Estos puertos son los que utilizan los servicios estndar del sistema como email, ftp o http. Para las aplicaciones que se desarrollen, asegurarse de seleccionar un puerto por encima del 1023. En el ejemplo anterior no se usan excepciones; sin embargo, es una gran idea la captura de excepciones cuando se est trabajando con sockets. El mismo ejemplo quedara como: Socket miCliente; try { miCliente = new Socket( "maquina",numeroPuerto ); } catch( IOException e ) { System.out.println( e );

} En el Servidor programamos, la forma de apertura del socket de la siguiente manera. Socket miServicio; try { miServicio = new ServerSocket( numeroPuerto ); } catch( IOException e ) { System.out.println( e ); } En la implementacin de un servidor tambin necesitamos crear un objeto socket desde el ServerSocket para que est atento a las conexiones que le puedan realizar clientes potenciales y poder aceptar esas conexiones: Socket socketServicio = null; try { socketServicio = miServicio.accept(); } catch( IOException e ) { System.out.println( e ); }

CREACIN DE STREAMS DE ENTRADA En la parte Cliente de la aplicacin, se puede utilizar la clase DataInputStream para crear un stream de entrada que est listo a recibir todas las respuestas que el servidor le enve. DataInputStream entrada; try { entrada = new DataInputStream( miCliente.getInputStream()); } catch(IOException e) { System.out.println( e ); }

La clase DataInputStream permite la lectura de lneas de texto y tipos de datos primitivos de Java de un modo altamente portable; dispone de mtodos para leer todos esos tipos como: read(), readChar(), readInt(), readDouble() y readLine(). Deberemos utilizar la funcin que creamos necesaria dependiendo del tipo de dato que esperemos recibir del servidor. En el Servidor, tambin usaremos DataInputStream, pero en este caso para recibir las entradas que se produzcan de los clientes que se hayan conectado: DataInputStream entrada; try { entrada = new DataInputStream( socketServicio.getInputStream() ); } catch( IOException e ) { System.out.println( e ); } CREACION DE STRAMS DE SALIDA En el lado del Cliente, podemos crear un stream de salida para enviar informacin al socket del servidor utilizando las clases PrintStream o DataOutputStream: PrintStream salida; try { salida = new PrintStream( miCliente.getOutputStream() ); } catch( IOException e ) { System.out.println( e ); } La clase PrintStream tiene mtodos para la representacin textual de todos los datos primitivos de Java. Sus mtodos write y println() tienen una especial importancia en este aspecto. No obstante, para el envo de informacin al servidor tambin podemos utilizar DataOutputStream: DataOutputStream salida; try { salida = new DataOutputStream( miCliente.getOutputStream() ); } catch( IOException e ) { System.out.println( e ); }

La clase DataOutputStream permite escribir cualquiera de los tipos primitivos de Java, muchos de sus mtodos escriben un tipo de dato primitivo en el stream de salida. De todos esos mtodos, el ms til quizs sea writeBytes(). En el Servidor, podemos utilizar la clase PrintStream para enviar informacin al cliente: PrintStream salida; try { salida = new PrintStream( socketServicio.getOutputStream() ); } catch( IOException e ) { System.out.println( e ); } Pero tambin podemos utilizar la clase DataOutputStream como en el caso de envo de informacin desde el cliente.

CIERRE DE SOCKEST Siempre deberemos cerrar los canales de entrada y salida que se hayan abierto durante la ejecucin de la aplicacin. En la parte del cliente: try { salida.close(); entrada.close(); miCliente.close(); } catch( IOException e ) { System.out.println( e ); } Y en la parte del servidor: try { salida.close(); entrada.close(); socketServicio.close(); miServicio.close(); } catch( IOException e ) { System.out.println( e );

} Es importante destacar que el orden de cierre es relevante. Es decir, se deben cerrar primero los streams relacionados con un socket antes que el propio socket, ya que de esta forma evitamos posibles errores de escrituras o lecturas sobre descriptores ya cerrados. CLASES TILES EN COMUNICACIONES Las clases que a continuacin se detallan resultan de utilidad cuando estamos desarrollando programas de comunicaciones. Socket Es el objeto bsico en toda comunicacin a travs de Internet, bajo el protocolo TCP. Esta clase proporciona mtodos para la entrada/salida a travs de streams que hacen la lectura y escritura a travs de sockets muy sencilla. ServerSocket Es un objeto utilizado en las aplicaciones servidor para escuchar las peticiones que realicen los clientes conectados a ese servidor. Este objeto no realiza el servicio, sino que crea un objeto Socket en funcin del cliente para realizar toda la comunicacin a travs de l. DatagramSocket La clase de sockets datagrama puede ser utilizada para implementar datagramas o fiables (sockets UDP), no ordenados. Aunque la comunicacin por estos sockets es muy rpida porque no hay que perder tiempo estableciendo la conexin entre cliente y servidor. DatagramPacket Clase que representa un paquete datagrama conteniendo informacin de paquete, longitud de paquete, direcciones Internet y nmeros de puerto. MulticastSocket Clase utilizada para crear una versin multicast de las clase socket datagrama. Mltiples clientes/servidores pueden transmitir a un grupo multicast (un grupo de direcciones IP compartiendo el mismo nmero de puerto). NetworkServer Una clase creada para implementar mtodos y variables utilizadas en la creacin de un servidor TCP/IP. NetworkClient Una clase creada para implementar mtodos y variables utilizadas en la creacin de un cliente TCP/IP. SocketImpl Es un Interfase que nos permite crearnos nuestro propio modelo de comunicacin. Tendremos que implementar sus mtodos cuando la usemos. Si vamos a desarrollar una aplicacin con requerimientos especiales de comunicaciones, como pueden se la implementacin de un cortafuegos (TCP es un protocolo no seguro), o acceder a equipos especiales (como un lector de cdigo de barras o un GPS diferencial), necesitaremos nuestra propia clase Socket. Un ejemplo entre un servidor y un cliente. SocketServidor.java es el servidor, SocketCliente.java es el cliente, Atributo.java es un atributo de una clase a enviar y

DatoSocket.java es la clase a enviar, que contiene un Atributo. Si todo est en el mismo directorio, puedes compilarlos desde una shell de linux $javac SocketServidor.java SocketCliente.java DatoSocket.java Atributo.java Para ejecutarlo, abre dos shell o ventanas de ms-dos distintas, situadas en el directorio donde est todo esto y escribe $java SocketServidor $java SocketCliente BIBLIOGRAFIA http://www.chuidiang.com/java/sockets/socket.php http://www.monografias.com/trabajos12/chtjava/chtjava.shtml http://www.face.ubiobio.cl/~prodrigu/sc1/pss/node97.htm http://nereida.deioc.ull.es/~cleon/doctorado/doc06/doc06/html/node9.html http://www.face.ubiobio.cl/~prodrigu/sc1/pss/node119.htm http://java.sun.com/javase/6/docs/api/java/net/Socket.html

También podría gustarte