Você está na página 1de 15

TECNOLOGICO DE ESTUDIOS SUPERIORES DE TIANGUSITENCO

ASIGNATURA: SISTEMAS OPERATIVOS DISTRIBUIDOS I

CATEDRATICO: MAURICIO ALCANTARA

ALUMNOS: MAYTE FRANCO REYES TERESA FORES AGUILAR JOSE RAUL LOPEZ MILLAN

PROYECTO: SOCKETS

GRADO: 7

GRUPO: 701

CICLO ESCOLAR 2011 - 2012

INDICE

FUNDAMENTOS FUNCIONAMIENTO GENERICO JAVA SOCKETS INTRODUCCION MODELO DE COMUNICACIONES CON JAVA APATURA DE SOCKETS CREACION DE STREAMS CREACION DE STREAMS DE ENTRADA CREACION DE STREAMS DE SALIDA CIERRE DE SOCKETS CLASES UTILES EN COMUNICACIONES EJEMPLO DE USO PROGRAMA CLIENTE PROGRAMA SERVIDOR EJECUCION

FUNDAMENTOS

Los sockets son un sistema de comunicacin entre procesos de diferentes mquinas de una red. Ms exactamente, un socket es un punto de comunicacin por el cual un proceso puede emitir o recibir informacin. Fueron popularizados por Berckley Software Distribution, de la universidad norteamericana de Berkley. Los sockets han de ser capaces de utilizar el protocolo de streams TCP (Transfer Contro Protocol) y el de datagramas UDP (User Datagram Protocol). Utilizan una serie de primitivas para establecer el punto de comunicacin, para conectarse a una mquina remota en un determinado puerto que est disponible, para escuchar en l, para leer o escribir y publicar informacin en l, y finalmente para desconectarse. Con todas las primitivas se puede crear un sistema de dilogo muy completo.

FUNCIONAMIENTO GENRICO
Normalmente, un servidor se ejecuta sobre una computadora especfica y tiene un socket que responde en un puerto especfico. El servidor nicamente espera, escuchando a travs del socket a que un cliente haga una peticin. En el lado del cliente: el cliente conoce el nombre de host de la mquina en la cual el servidor se encuentra ejecutando y el nmero de puerto en el cual el servidor est conectado. Para realizar una peticin de conexin , el cliente intenta encontrar al servidor en la mquina servidora en el puerto especificado.

Si todo va bien, el servidor acepta la conexin. Adems de aceptar, el servidor obtiene un nuevo socket sobre un puerto diferente. Esto se debe a que necesita un nuevo socket (y , en consecuencia, un numero de puerto diferente) para seguir atendiendo al socket original para peticiones de conexin mientras atiende las necesidades del cliente que se conect.

Por la parte del cliente, si la conexin es aceptada, un socket se crea de forma satisfactoria y puede usarlo para comunicarse con el servidor. Es importante darse cuenta que el socket en el cliente no est utilizando el nmero de puerto usado para realizar la peticin al servidor. En lugar de ste, el cliente asigna un nmero de puerto local a la mquina en la cual est siendo ejecutado. Ahora el cliente y el servidor pueden comunicarse escribiendo o leyendo en o desde sus respectivos sockets.

JAVA SOCKETS
INTRODUCCION El paquete java.net de la plataforma Java 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. La clase Socket se sita en la parte ms alta de una implementacin dependiente de la plataforma, ocultando los detalles de cualquier sistema particular al programa Java. 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. 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. Nuestro objetivo ser conocer cmo utilizar las clases Socket y ServerSocket. Por otra parte, si intentamos conectar a travs de la Web, la clase URL y clases relacionadas (URLConnection, URLEncoder) son probablemente ms apropiadas que las clases de sockets. Pero de hecho , las clases URL no son ms que una conexin a un nivel ms alto a la Web y utlilizan como parte de su implementacin interna los sockets.

MODELO DE COMUNICACIONES CON JAVA El modelo de sockets ms simple es: El servidor establece un puerto y espera durante un cierto tiempo (timeout segundos), a que el cliente establezca la conexin. Cuando el cliente solicite una conexin, el servidor abrir la conexin socket con el mtodo accept(). El cliente establece una conexin con la mquina host a travs del puerto que se designe en puerto# El cliente y el servidor se comunican con manejadores InputStream y OutputStream

APERTURA DE SOCKETS Si estamos programando un CLIENTE, el socket se abre de la forma: 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 ); } Si estamos programando un SERVIDOR, la forma de apertura del socket es la que muestra el siguiente ejemplo: Socket miServicio; try { miServicio = new ServerSocket( numeroPuerto ); } catch( IOException e ) { System.out.println( e ); }

A la hora de 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

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 lado del 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 ); }

CREACIN DE STREAMS 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 lado del 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 SOCKETS 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 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 no 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 Interface 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.

10

EJEMPLO DE USO Para comprender el funcionamiento de los sockets no hay nada mejor que estudiar un ejemplo. El que a continuacin se presenta establece un pequeo dilogo entre un programa servidor y sus clientes, que intercambiarn cadenas de informacin. PROGRAMA CLIENTE El programa cliente se conecta a un servidor indicando el nombre de la mquina y el nmero puerto (tipo de servicio que solicita) en el que el servidor est instalado. Una vez conectado, lee una cadena del servidor y la escribe en la pantalla: import java.io.*; import java.net.*; class Cliente { static final String HOST = "localhost"; static final int PUERTO=5000; public Cliente( ) { try{ Socket skCliente = new Socket( HOST , Puerto ); InputStream aux = skCliente.getInputStream(); DataInputStream flujo = new DataInputStream( aux ); System.out.println( flujo.readUTF() ); skCliente.close(); } catch( Exception e ) { System.out.println( e.getMessage() ); } } public static void main( String[] arg ) { new Cliente(); } }

En primer lugar se crea el socket denominado skCliente, al que se le especifican el nombre de host (HOST) y el nmero de puerto (PORT) en este ejemplo constantes. Luego se asocia el flujo de datos de dicho socket (obtenido mediante getInputStream)), que es asociado a un flujo (flujo) DataInputStream de lectura secuencial. De dicho flujo capturamos una cadena ( readUTF() ), y la imprimimos por pantalla (System.out). El socket se cierra, una vez finalizadas las operaciones, mediante el mtodo close(). Debe observarse que se realiza una gestin de excepcin para capturar los posibles fallos tanto de los flujos de datos como del socket.

11

PROGRAMA SERVIDOR El programa servidor se instala en un puerto determinado, a la espera de conexiones, a las que tratar mediante un segundo socket. Cada vez que se presenta un cliente, le saluda con una frase "Hola cliente N". Este servidor slo atender hasta tres clientes, y despus finalizar su ejecucin, pero es habitual utilizar bucles infinitos ( while(true) ) en los servidores, para que atiendan llamadas continuamente. Tras atender cuatro clientes, el servidor deja de ofrecer su servicio: import java.io.* ; import java.net.* ; class Servidor { static final int PUERTO=5000; public Servidor( ) { try { ServerSocket skServidor = new ServerSocket(PUERTO); System.out.println("Escucho el puerto " + PUERTO ); for ( int numCli = 0; numCli < 3; numCli++; ) { Socket skCliente = skServidor.accept(); // Crea objeto System.out.println("Sirvo al cliente " + numCli); OutputStream aux = skCliente.getOutputStream(); DataOutputStream flujo= new DataOutputStream( aux ); flujo.writeUTF( "Hola cliente " + numCli ); skCliente.close(); } System.out.println("Demasiados clientes por hoy"); } catch( Exception e ) { System.out.println( e.getMessage() ); } } public static void main( String[] arg ) { new Servidor(); } }

Utiliza un objeto de la clase ServerSocket (skServidor), que sirve para esperar las conexiones en un puerto determinado (PUERTO), y un objeto de la clase Socket (skCliente) que sirve para gestionar una conexin con cada cliente. Mediante un bucle for y la variable numCli se restringe el nmero de clientes a tres, con lo que cada vez que en el puerto de este servidor aparezca un cliente, se atiende y se incrementa el contador.

12

Para atender a los clientes se utiliza la primitiva accept() de la clase ServerSocket, que es una rutina que crea un nuevo Socket (skCliente) para atender a un cliente que se ha conectado a ese servidor. Se asocia al socket creado (skCliente) un flujo (flujo) de salida DataOutputStream de escritura secuencial, en el que se escribe el mensaje a enviar al cliente. El tratamiento de las excepciones es muy reducido en nuestro ejemplo, tan solo se captura e imprime el mensaje que incluye la excepcin mediante getMessage().

13

EJECUCIN Aunque la ejecucin de los sockets est diseada para trabajar con ordenadores en red, en sistemas operativos multitarea (por ejemplo Windows y UNIX) se puede probar el correcto funcionamiento de un programa de sockets en una misma mquina. Para ellos se ha de colocar el servidor en una ventana, obteniendo lo siguiente: >java Servidor Escucho el puerto 5000 En otra ventana se lanza varias veces el programa cliente, obteniendo: >java Cliente Hola cliente 1 >java cliente Hola cliente 2 >java cliente Hola cliente 3 >java cliente connection refused: no further information

Mientras tanto en la ventana del servidor se ha impreso: Sirvo al cliente 1 Sirvo al cliente 2 Sirvo al cliente 3 Demasiados clientes por hoy Cuando se lanza el cuarto de cliente, el servidor ya ha cortado la conexin, con lo que se lanza una excepcin. Obsrvese que tanto el cliente como el servidor pueden leer o escribir del socket. Los mecanismos de comunicacin pueden ser refinados cambiando la implementacin de los sockets, mediante la utilizacin de las clases abstractas que el paquete java.net provee.

14

Você também pode gostar