Title: Comunicaciones
1Comunicaciones
- Tabla de Contenido
- Introducción
- Relación con Threads
- Sockets
- Ejemplo Servidor ECO
- Ejemplo Cadena de Ordenes
2Introducción
- Dos enfoques a la hora de explotar la
funcionalidad asociada a los hilos - Basado en tareas
- En este enfoque la razón principal de utilizar un
hilo es invocar asincrónicamente a un método que
realiza una determinada tarea. - La tarea puede abarcar desde un único método
hasta una sesión completa. - Los diseños basados en tareas se encuentran en
entornos orientados a eventos, computación en
paralelo y en sistemas que hacen un fuerte uso de
entrada y salida. - Basado en actores
- La razón principal para de utilizar un hilo
consiste en crear y poner en marcha un nuevo
objeto autónomo, activo, similar a un proceso. - Este objeto puede reaccionar frente a eventos
externos, interactuar con otros actores. - Los diseños basados en actores se encuentran en
sistemas de control, reactivos y distribuidos.
3Introducción
- Ejemplo de diseño de un servicio Web
- El Servicio Web
- Es un hilo del tipo actor que hace las veces de
un proceso sin interfaz - Interacciona continuamente con su entorno a la
espera de nuevas solicitudes entrantes. - Para atender las distintas peticiones se sigue un
enfoque basado en tareas, poniendo en marcha una
nueva tarea para responder a cada una de las
solicitudes entrantes. - El cliente Web
- Es un hilo del tipo actor que pide solicita
servicios a al servidor Web. - Existen diferentes estilos para comunicar
unidireccionalmente ambos objetos activos. - Cadenas de ordenes el receptor deberá analizar y
procesar la tarea asociada, suelen basarse en
comunicaciones con sockets
4Introducción
- Objetos de eventos el mensaje contiene la
descripción estructurada de un evento. El
receptor lanza alguna tarea asociada a un evento.
Se utilizan en entornos GUI. - Objetos de solicitud el mensaje contiene la
codificación del nombre de un método y algunos
argumentos . El receptor produce la llamada
correspondiente a un método, destinada a un
objeto auxiliar que ejecutará ese método. Se
utilizan en sistemas de soporte para objetos
distribuidos tales como los que se encuentran en
java.rmi y org.omg.corba. - Objetos de clase El mensaje es una representación
de una clase, de la cual crea una instancia el
receptor. Este esquema se utiliza en el entorno
java.applet. - Objetos ejecutables El mensaje consta de un
cierto código que ejecuta el receptor. - Objetos arbitrarios El emisor puede tratar a
cualquier clase de objeto como un mensaje
mediante la inclusión de ese objeto como
argumento de un método o pasándole a través de un
canal
5Introducción
Una forma de mantener la comunicación Sockets
Servicio
Atributos y conexiones
for ( ) aceptar una petición crear una
tarea
mensaje
Acepta Mensajes
6Introducción
Objetos de eventos
7Introducción
8Sockets
- Java proporciona un nivel de conexión basado en
puertos y sockets. En su paquete java.net - Un puerto es una abstracción de un lugar fÃsico a
través del que se puede establecer una conexión
entre un cliente y un servidor. Se dice que el
servidor proporciona el puerto y el cliente se
enlaza al mismo.
9Sockets
- En general, en la arquitectura cliente-servidor
existe un objeto activo servidor que proporciona
un servicio y unos clientes que lo solicitan. - Para conseguir establecer la comunicación entre
ambos objetos existen sockets servidores y
sockets de cliente representados por las clases
SocketServer y Socket, situadas en el paquete
java.net..
10Sockets
- La comunicación bidireccional entre el cliente y
el servidor se implementa en Java utilizando los
flujos de entrada y salida (InputStream y
OutputStream) - Para cada socket se puede acceder a los flujos de
entrada con getInputStream () y a los de salida
con getOutputStream (). - Hay que establecer un protocolo de comunicación
entre el cliente y el servidor para poder
interpretar esos mensajes.
11Sockets
- Esquema de un sistema basado en comunicación con
Sockets
12Sockets
- Código para abrir un socket cliente sobre un
servidor - Socket miCliente
- try
- miCliente new Socket ("servidor",
numeroPuerto) -
- catch (IOException e)
System.out.println (e)
-
13Sockets
- Código para abrir un socket servidor donde puedan
conectarse los clientes - ServerSocket miServicio
- try
- miServicio new ServerSocket (numeroPuerto)
-
- catch (IOException e)
- System.out.println (e)
-
- Socket socketServicio null
- try
- socketServicio miServicio.accept ()
-
- catch (IOException e)
- System.out.println (e)
14Sockets
- Código para crear un stream de entrada sobre un
Socket previamente abierto - Socket s
- BufferedReader sIn
- ...
- try
- sInnew BufferedReader (new InputStreamReader(s.g
etInputStream())) - ...
-
- catch( IOException e )
- finally sIn.close()
15Sockets
- Codigo para crear un stream de salida sobre un
Socket previamente abierto - Socket s
- PrintWriter sOut
- ...
- try
- sOut new PrintWriter(s.getOutputStream(),true)
- ...
-
- catch( IOException e )
- finally sOut.close()
16Ejemplo Servidor ECO ( Carpeta ECO)
import java.net. class ServidorEco public
static void main( String args )
ServerSocket s null Socket cliente
null // Establecemos el servicio en el puerto
9999 // No se puede elegir un puerto por debajo
del 1023 si no somos usuarios privilegiados
try s new ServerSocket( 9999 )
catch( IOException e )
System.out.println( e )
17Ejemplo Servidor ECO
// Creamos el objeto desde el cual
atenderemos y aceptaremos // las conexiones
de los clientes y abrimos los canales de //
comunicación de entrada y salida while
(true) try cliente
s.accept() new GestorPeticion(cliente).
start() catch( IOException e )
System.out.println( e )
//main //Class ServidorECO
18Ejemplo Servidor ECO
class GestorPeticion extends Thread Socket
s public GestorPeticion (Socket s )
this.s s public void run()
BufferedReader sIn PrintWriter sOut
try // Apertura de Streams asociados al
Socket sIn new BufferedReader (new
InputStreamReader(s.getInputStream()))
sOut new PrintWriter(s.getOutputStream(),true)
19Ejemplo Servidor ECO
// Recepción de datos por el Stream de
entrada String texto sIn.readLine()
// Replico datos sOut.println(
"Respuesta del servidor de ECO " texto )
// Cierre de Stream y socket
sIn.close() sOut.close()
s.close() catch( IOException e )
System.out.println( e )
20Ejemplo Servidor ECO
- Como ejecutar el servidor
- Compilar y ejecutar la clase ServidorEco. Cuando
se este ejecutando el servidor existe un nuevo
servicio en la máquina a la escucha en el puerto
9999. - Se necesita un cliente que solicite servicio. Se
puede utilizar un cliente telnet para probar el
servidor. - Telnet IP numero_port
- telnet localhost 9999
- Introducir una cadena y el servidor replicará la
cadena y cerrará la sesión.
21Ejemplo Cliente ECO
class ClienteEco public static void main(
String args ) Socket miCliente
BufferedReader entrada PrintWriter salida
try miCliente new
Socket ("localhost", 9999) entrada new
BufferedReader (new InputStreamReader(m
iCliente.getInputStream())) salida new
PrintWriter(miCliente.getOutputStream(),true)
salida.println("Hola") // EnvÃo datos
System.out.println(entrada.readLine())// Recibo
el eco
entrada.close() salida.close()
catch( IOException e )
System.out.println( e )
22Ejemplo Cadena de Ordenes (Carpeta ECO2)
- En el ejemplo anterior se han visto los aspectos
puramente técnicos y la arquitectura para
trabajar con servicios WEB. - Una forma de mantener la comunicación entre el
cliente y el servidor es interpretar los datos
que llegan a través de los Stream. - El conjunto de ordenes utilizadas en la
comunicación se denomina protocolo. - En el siguiente ejemplo se va a mantener la
conexión hasta que el cliente introduce la cadena
( orden ) bye. - Cuando el servidor recibe BYE envÃa un mensaje
de fin de conexión - Se muestran las modificaciones en la clase
GestorPeticion, en su método run().
23Ejemplo Cadena de Ordenes
boolean fin false try sIn
new BufferedReader (new InputStreamReader(s.getInp
utStream())) sOut new
PrintWriter(s.getOutputStream(),true)
sOut.println( "")
sOut.println( "Bienvenido al servidor
de ECO ") sOut.println( "Escribe BYE
para terminar ") sOut.println(
"") while
(!fin) String texto sIn.readLine()
// Comprobar que no es la cadena BYE
if (texto.regionMatches(true,0,"BYE",0,3))
sOut.println( "Abandono la conexion del
servidor de ECO") fin true
else sOut.println( texto)
//While sIn.close()
sOut.close() s.close()
24Ejemplo Cadena de Ordenes
- En la carpeta ECO3, se encuentra el desarrollo de
un applet que implementa un cliente que se
comunica con el Servidor de ECO. - Al igual que el servidor el cliente también añade
su propio bucle de escucha del Stream hasta que
envÃa el comando BYE.
//pleaseStop es una variable booleana que se
activa cuando el cliente escribe bye while
(!pleaseStop) try
String lineentrada.readLine()
//Procesamiento de la entrada
ta.append(line "\n")
catch (IOException e) /
While /
25BibliografÃa
- Judy M.Bishop, Java Fundamentos de Programación
BIS98 - CapÃtulo 14,Trabajo en Red.