Part Two: A literature review of boards and their roles
CHAPTER 3 RESEARCH METHODOLOGY
5.5 Professional learning and development (PLD)
En Java, crear una conexión socket TCP/IP se realiza directamente con el paquete java.net. A continuación mostramos un diagrama de lo que ocurre en el lado del
cliente y del servidor:
Diapositiva 18
SOCKETS
Diapositiva 19
Diapositiva 20
SOCKETS
Los socketsson mecanismos de comunicación entre procesos que permiten que un proceso hable ( emita o reciba información ) con otro proceso incluso estando en distintas máquinas. Un socketes al sistema de comunicación entre ordenadores lo que un buzón o un teléfono es al sistema de comunicación entre personas: un punto de comunicación entre dos agentes ( procesos o personasrespectivamente ) por el cual se puede emitir o recibir información.
La forma de referenciar un socket por los procesos implicados es mediante un descriptor del mismo tipo que el utilizado para referenciar Archivos.
Se podrá realizar redirecciones de los archivos de E/S estándar (descriptores 0,1 y 2) a los sockets y así combinar entre ellos aplicaciones de la red.
Todo nuevo proceso creado heredará, por tanto, los descriptores de socketsde su padre.
Diapositiva 21
SOCKETS
La comunicación entre procesos a través de sockets se basa en la filosofía CLIENTE-SERVIDOR:
Un proceso en esta comunicación actuará de proceso servidor creando un socket cuyo nombre conocerá el proceso cliente, que podrá "hablar" con el proceso servidor a través de la conexión con dicho socket.
El otro proceso actuará como cliente creando un socket sin nombre cuyo descriptor usará para leer o escribir.
El enlace entre los dos sockets permite una comunicación
bidireccional,característica propia de los sockets y que los diferencia de los pipes, o canales de comunicación unidireccional entre procesos de una misma máquina.
Diapositiva 22
SOCKETS
El mecanismo de comunicación vía sockets tiene los siguientes pasos:
1º) El proceso servidor crea un socket con nombre y espera la conexión.
2º) El proceso cliente crea un socket sin nombre.
3º) El proceso cliente realiza una petición de conexión al socket servidor.
4º) El cliente realiza la conexión a través de su socket mientras el proceso servidor mantiene el socket servidor original con nombre.
Diapositiva 23
SOCKETS
Es muy común en este tipo de comunicación lanzar un proceso hijo, una vez realizada la conexión, que se ocupe del intercambio de información con el proceso cliente mientras el proceso padre servidor sigue aceptando conexiones.
*Todo socket viene definido por dos características fundamentales:
-El tipo del socket, que indica la naturaleza del mismo, el tipo de comunicación que puede generarse entre los sockets.
-El dominio del socket especifica el conjunto de sockets que puedenestablecer una comunicación con el mismo.
Diapositiva 24
Tipos de SOCKETS
Define las propiedades de las comunicaciones en las que se ve envuelto un socket, esto es, el tipo de comunicación que se puede dar entre cliente y servidor.
Estas pueden ser: - Fiabilidad de transmisión.
- Mantenimiento del orden de los datos. - No duplicación de los datos.
- El "Modo Conectado" en la comunicación. - Envío de mensajes urgentes
Diapositiva 25
Si estamos programando un cliente, el socket se abre de la forma: Socket Cliente;
Cliente = new Socket( "maquina",numeroPuerto );
Implementación de un Cliente en Java
Diapositiva 26
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 quedaría 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 ); }
Diapositiva 27
A la hora de la implementación de un servidor también 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 ); }
Diapositiva 28
Creación de Streams de Entrada
En la parte cliente de la aplicación, se puede utilizar la clase DataInputStream para crear un stream de entrada que esté listo a recibir todas las respuestas que el servidor le envíe.
DataInputStream entrada;
try { entrada = new DataInputStream( miCliente.getInputStream() ); } catch( IOException e ) { System.out.println( e ); }
La clase DataInputStream permite la lectura de líneas de texto y tipos de datos primitivos de Java de un modo altamente portable; dispone de métodos para leer todos esos tipos como: read(), readChar(), readInt(), readDouble() y readLine(). Deberemos utilizar la función que creamos necesaria dependiendo del tipo de dato que esperemos recibir del servidor.
En el lado del servidor, también 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 ); }
Diapositiva 29
Creación de Streams de Salida
En el lado del cliente, podemos crear un stream de salida para enviar información 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 métodos para la representación textual de todos los datos primitivos de Java. Sus métodos write y println() tienen una especial importancia en este aspecto. No obstante, para el envío de información al servidor
también podemos utilizar DataOutputStream: DataOutputStream salida;
try {
salida = new DataOutputStream( miCliente.getOutputStream() ); } catch( IOException e ) { System.out.println( e ); }
Diapositiva 30
La clase DataOutputStream permite escribir cualquiera de los tipos primitivos de Java, muchos de sus métodos escriben un tipo de dato primitivo en el stream de salida. De todos esos métodos, el más útil quizás sea writeBytes().
En el lado del servidor, podemos utilizar la clase PrintStream para enviar información al cliente:
PrintStream salida; try {
salida = new PrintStream(
socketServicio.getOutputStream() ); } catch( IOException e ) { System.out.println( e ); }
Pero también podemos utilizar la clase DataOutputStream como en el caso de envío de información desde el cliente.
Diapositiva 31
Siempre deberemos cerrar los canales de entrada y salida que se hayan abierto durante la ejecución de la aplicación. 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 ); }