l3-Cliente Servidor en Java-V1b

37
Cliente/Servidor en Java Grupo ARCOS Desarrollo de Aplicaciones Distribuidas Ingeniería Informática Universidad Carlos III de Madrid

Transcript of l3-Cliente Servidor en Java-V1b

Page 1: l3-Cliente Servidor en Java-V1b

Cliente/Servidor en Java

Grupo ARCOS

Desarrollo de Aplicaciones Distribuidas

Ingeniería Informática

Universidad Carlos III de Madrid

Page 2: l3-Cliente Servidor en Java-V1b

Contenidos

1. Introducción: 1. Paradigma cliente/servidor2. Entorno de programación Java

2. Cliente/servidor en Java

ARCOS @ UC3M2

2. Cliente/servidor en Java1. Introducción2. Ejemplo con sockets

Page 3: l3-Cliente Servidor en Java-V1b

Contenidos

1. Introducción: 1. Paradigma cliente/servidor2. Entorno de programación Java

2. Cliente/servidor en Java

ARCOS @ UC3M3

2. Cliente/servidor en Java1. Introducción2. Ejemplo con sockets

Page 4: l3-Cliente Servidor en Java-V1b

Paradigmas cliente/servidor y P2P

Espacio de objetos, aplicaciones colaborativas

Servicios de red, object request broker, agentes móviles

alto

ARCOS @ UC3M4

procedimientos remotos, métodos remotos

Cliente-servidor, peer-to-peer

Paso de mensajes

bajo

Page 5: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

� Asigna roles diferentes a dos procesos que colaboran:

� Servidor: es el proveedor del servicio. Espera de forma pasiva la llegada de peticiones.

� Cliente: invoca peticiones al servidor y aguarda su respuesta.

Servidor Cliente 1

ARCOS @ UC3M5

...

Petición de servicio

Proceso servidor

Proceso cliente

Servicio

Servidor Cliente 1

Cliente 2

Page 6: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

� Proporciona una abstracción eficiente para facilitar los servicios de red.

� La asignación de roles asimétricos simplifica la sincronización.

� Paradigma adecuado para servicios centralizados.

ARCOS @ UC3M6

� Paradigma adecuado para servicios centralizados.

� Ejemplos: servicios de internet como HTTP, FTP, DNS, finger, etc.

� Implementación mediante sockets, llamada a procedimientos remotos (RPC) o invocación de métodos remotos (RMI).

Page 7: l3-Cliente Servidor en Java-V1b

Paradigma peer-to-peer

� Asignación de roles simétrica:

� Los procesos participantes tienen el mismo papel

� un mismo proceso puede actuar tanto como cliente como servidor

Proceso 1

Sol

icitu

d

Respuesta S

olic

itud

Respuesta

ARCOS @ UC3M7

� Los recursos computacionales y los servicios son intercambiados entre los computadores.

� Ejemplo: servicios de intercambiode ficheros como Gnutella

Sol

icitu

d

Respuesta S

olic

itud

Respuesta

Proceso 2

Page 8: l3-Cliente Servidor en Java-V1b

Paradigma híbridos (c/s + p2p)

� Modelos híbridos cliente-servidor y peer-to-peer

� Ejemplo: servicio de intercambio de ficheros Napster

ARCOS @ UC3M8

Page 9: l3-Cliente Servidor en Java-V1b

Paradigma del sistema de mensajes

� También denominado middleware orientado a mensajes (MOM)

� El sistema de mensajes actúa de intermediario entre los procesos que se comunican

� Proceso:

� Emisión al sistema de mensajes

� Almacenamiento en la cola asociada al receptor

ARCOS @ UC3M9

� Almacenamiento en la cola asociada al receptor

� Envío al proceso receptor

...

...Sistema de mensajes

Receptores Emisores

Page 10: l3-Cliente Servidor en Java-V1b

Paradigma del sistema de mensajes

� Comunicación asíncrona y desacoplada.

� Una vez que el emisor envía el mensaje al sistema de mensajes, queda libre para realizar otra tarea.

� Existen dos subclases de sistema de mensajes:

ARCOS @ UC3M10

� Existen dos subclases de sistema de mensajes: el punto a punto y el publicación/suscripción.

� Sistema de mensajes punto a punto:� El sistema de mensajes proporciona el middleware

que gestiona cada cola de mensajes� Envío y recepción están desacopladas:

uso del threads o procesos hijo

Page 11: l3-Cliente Servidor en Java-V1b

Paradigma del sistema de mensajes

� Sistema de mensajes publicación/suscripción:� Cada mensaje se asocia con un determinado evento.� Pasos:

1. Cada participante se subscribe a los mensajes asociados a cada evento (operación suscribir).

2. Cuando el evento ocurre el middleware distribuye el mensaje a

ARCOS @ UC3M11

2. Cuando el evento ocurre el middleware distribuye el mensaje a todos los subscriptores (operación publicar).

� Los eventos pueden ser iniciados por cualquier participante.

� Ejemplos de servicio: � MQ*Series de IBM

� Microsoft’s Message Queue (MSMQ)

� Java’s Message Service (JMS)

Page 12: l3-Cliente Servidor en Java-V1b

Contenidos

1. Introducción: 1. Paradigma cliente/servidor2. Entorno de programación Java

2. Cliente/servidor en Java

ARCOS @ UC3M12

2. Cliente/servidor en Java1. Introducción2. Ejemplo con sockets

Page 13: l3-Cliente Servidor en Java-V1b

Java: características

� Lógica basada en 3 capas:

� Presentación � Interfaz con el usuario

ARCOS @ UC3M13

� Lógica de negocio � Programa que responde a las peticiones del usuario

� Lógica de acceso a datos� Interfaz con el almacenamiento de datos

(ej.: base de datos)

Page 14: l3-Cliente Servidor en Java-V1b

Java: características

ARCOS @ UC3M14

Page 15: l3-Cliente Servidor en Java-V1b

Contenidos

1. Introducción: 1. Paradigma cliente/servidor2. Entorno de programación Java

2. Cliente/servidor en Java

ARCOS @ UC3M15

2. Cliente/servidor en Java1. Introducción2. Ejemplo con sockets

Page 16: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

� Los procesos desempeñan dos roles asimétricos.� Representa el paradigma de sistemas distribuidos

con una mayor difusión.� Acceso (por parte de los clientes) de servicios de red.

ARCOS @ UC3M16

� Acceso (por parte de los clientes) de servicios de red.� Flujo de ejecución del servidor:

1. Inicio servicio.2. Espera hasta aceptar petición de un cliente.3. Inicia sesión de servicio con el cliente.4. Vuelta al paso 2.

Page 17: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

Proceso cliente

Proceso servidor

Inicia canal

Inicia canal

ARCOS @ UC3M17

Inicia canal

escucha

lectura

cierre

Aceptación

peticiónAbrir conexión

lectura

Cierre

Peticiónescritura

Respuestaescritura

Creación proceso hijo

Page 18: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

� Protocolo de servicio:� Localización del servicio.� Comunicación entre procesos.

cliente servidor

Petición1

Respuesta1

2Petición

Respuesta

ARCOS @ UC3M18

� Comunicación entre procesos.� Sin conexión

� Orientados a conexión

� Sincronización de eventos.� Representación de datos.

nPetición

2Respuesta

nRespuesta

Page 19: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

� Gestión de la sesión por parte del servidor:

� Servidor iterativoCliente

petición

servidor

ARCOS @ UC3M19

� Servidor concurrente:

� Procesos pesados� Procesos ligeros � IPC asíncronas

respuesta

petición

Cliente

respuesta

servidor

Crea proceso

Procesohijo

Page 20: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

� Servidor concurrentecliente 2

mensaje

echo

Servidor cliente 1

mensaje

cliente 2

mensaje

echo

Servidor cliente 1

mensaje

� Servidor secuencial

ARCOS @ UC3M20

mensaje

mensaje

echomensaje

echo

echo

echo

mensaje

mensaje

echo

mensaje

echo

echo

echo

Page 21: l3-Cliente Servidor en Java-V1b

Paradigma cliente-servidor

� Arquitectura del software:� Presentación

� Lógica de aplicación

� Servicio (almacenamiento)

clienteservidorcliente

Petición1

Respuesta1

2Petición

servidor

Petición1

Respuesta1

2Petición

ARCOS @ UC3M21

nPetición

2Respuesta

nRespuestanPetición

2Respuesta

nRespuesta

Page 22: l3-Cliente Servidor en Java-V1b

Tipos de servicios

� Sin estado

� Ej.: daytime, echo, etc.

� Con estado

� Con estado global

� Ej.: counter

ARCOS @ UC3M22

� Ej.: counter

� Con estado de sesión

� Ej.: ftp

� Servidor híbrido: información del estado se distribuye entre el servidor y el cliente.

Page 23: l3-Cliente Servidor en Java-V1b

Contenidos

1. Introducción: 1. Paradigma cliente/servidor2. Entorno de programación Java

2. Cliente/servidor en Java

ARCOS @ UC3M23

2. Cliente/servidor en Java1. Introducción2. Ejemplo con sockets

Page 24: l3-Cliente Servidor en Java-V1b

Ejemplo (streams)

clientesumar(5,2)

5+2

servidor

Máquina A Máquina B

ARCOS @ UC3M24

NÚCLEO

5+2

7 NÚCLEO

RED

Page 25: l3-Cliente Servidor en Java-V1b

Client.java (1/2)

import java.io.* ;

import java.net.* ;

public class Client

{

public static void main ( String [] args) {

int res;

int num[] = new int [2];

NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

ARCOS @ UC3M25

int num[] = new int [2];

if (args.length != 1) {

System.out.println("Uso: cliente <host>");

System.exit(0);

}

try {

String host = args[0];

Socket sc = new Socket(host, 2500); // socket servidor

OutputStream ostream = sc.getOutputStream();

ObjectOutput s = new ObjectOutputStream(ostream);

Page 26: l3-Cliente Servidor en Java-V1b

Client.java (2/2)

num[0] = 5; num[1] = 2; //prepara la petición

s.writeObject (num);

s.flush ();

DataInputStream istream = new DataInputStream( sc.getInputStream ());

res = istream.readInt ();

NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

ARCOS @ UC3M26

res = istream.readInt ();

sc.close ();

System.out.println("La suma es " + res);

} catch (Exception e) {

System.err.println("excepcion " + e.toString() );

e.printStackTrace() ;

}

}

}

Page 27: l3-Cliente Servidor en Java-V1b

import java.io.* ;

import java.net.* ;

public class Server

{

public static void main ( String [] args) {

ServerSocket serverAddr = null ;

Server.java (1/2) NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

ServerSocket serverAddr = null ;

Socket sc = null;

int num[] ;

int res;

try {

serverAddr = new ServerSocket(2500) ;

}

catch (Exception e){

System.err.println("Error creando socket");

}

ARCOS @ UC3M27

Page 28: l3-Cliente Servidor en Java-V1b

while (true) {

try {

sc = serverAddr.accept(); // esperando conexión

InputStream istream = sc.getInputStream();

ObjectInput in = new ObjectInputStream(istream);

num = (int[]) in.readObject();

res = num[0] + num[1]; Thread.sleep(2000);

DataOutputStream ostream = new DataOutputStream(sc.ge tOutputStream());

Server.java (2/2) NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

ostream.writeInt(res);

ostream.flush();

sc.close();

} catch(Exception e) {

System.err.println( "excepcion " + e.toString() );

e.printStackTrace() ;

} // try

} // while

} // main

} // servidor

ARCOS @ UC3M28

Page 29: l3-Cliente Servidor en Java-V1b

Compilación del ejemploguernika.lab.inf.uc3m.es

NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

ARCOS @ UC3M29

# javac -cp /usr/lib/jvm/java-1.4.2-gcj-4.1-1.4.2.0/jre/lib/rt.jar \-g Client.java Server.java

Page 30: l3-Cliente Servidor en Java-V1b

Ejecución del ejemploguernika.lab.inf.uc3m.es

# java Server &

# java Client

Uso: cliente <host>

ARCOS @ UC3M30

# java Client localhost

La suma es 7

Page 31: l3-Cliente Servidor en Java-V1b

Ejemplo 2 (streams)

clientesumar(5,2)

5+2

servidor

Máquina B

cliente

Máquina A

ARCOS @ UC3M31

NÚCLEO

5+2

7 NÚCLEO

RED

NÚCLEO

Page 32: l3-Cliente Servidor en Java-V1b

import java.io.* ;

import java.net.* ;

import java.lang.Thread ;

class clientHandler implements Runnable

{

Server2.java (1/3) NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

{

private Socket socket ;

Thread t ;

public clientHandler ( Socket socket ) {

this.socket = socket ;

this.t = new Thread(this) ;

t.start() ;

}

ARCOS @ UC3M32

Page 33: l3-Cliente Servidor en Java-V1b

public void run () {

int num[] ; int res;

try {

InputStream istream = socket.getInputStream();

ObjectInput in = new ObjectInputStream(istream);

num = (int[]) in.readObject();

res = num[0] + num[1]; Thread.sleep (2000);

Server2.java (2/3) NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

res = num[0] + num[1]; Thread.sleep (2000);

DataOutputStream ostream = new DataOutputStream( socket.getOutputStream() );

ostream.writeInt(res);

ostream.flush();

socket.close();

} catch (Exception e) {

System.err.println("Error al operar con el cliente" );

}

} // run

} // clientHandler

ARCOS @ UC3M33

Page 34: l3-Cliente Servidor en Java-V1b

public class Server2 {

public static void main ( String [] args) {

ServerSocket serverAddr = null;

Socket sc = null;

try {

serverAddr = new ServerSocket(2500);

Server2.java (3/3) NÚCLEO

clientesumar(5,2)

5+2

resultado = 7

servidor

Máquina A Máquina B

NÚCLEO

RED

while (true) {

sc = serverAddr.accept(); // esperando conexión

new clientHandler(sc) ;

}

} catch (Exception e) {

System.err.println("excepcion " + e.toString() );

e.printStackTrace() ;

}

} // main

} // servidor

ARCOS @ UC3M34

Page 35: l3-Cliente Servidor en Java-V1b

#!/bin/sh

set -x

I=0

while [ $I -lt 10 ]; do

java Client localhost &

I=` expr $I + 1`

clients.sh

I=` expr $I + 1`

done

ARCOS @ UC3M35

# chmod a+x clients.sh

Page 36: l3-Cliente Servidor en Java-V1b

Ejecución del ejemploguernika.lab.inf.uc3m.es

# : servidor NO concurrente

# java Server &

# ./clients.sh

ARCOS @ UC3M36

# : servidor SI concurrente

# java kill -9 %1

# java Server2 &

# ./clients.sh

Page 37: l3-Cliente Servidor en Java-V1b

Cliente/Servidor en Java

Grupo ARCOS

Desarrollo de Aplicaciones Distribuidas

Ingeniería Informática

Universidad Carlos III de Madrid