Paso de mensajes en Java - acaldero.github.io
Transcript of Paso de mensajes en Java - acaldero.github.io
![Page 1: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/1.jpg)
Paso de mensajes en Java
Grupo ARCOS
Desarrollo de Aplicaciones Distribuidas
Ingeniería Informática
Universidad Carlos III de Madrid
![Page 2: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/2.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M2
1. Introducción:
1. Paradigma de paso de mensajes
2. Entorno de programación Java
2. Paso de mensajes en Java: sockets
1. Introducción a sockets
2. Sockets en Java
1. Datagrama
2. Orientado a conexión
3. Difusión (comunicación en grupo)
![Page 3: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/3.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M3
1. Introducción:
1. Paradigma de paso de mensajes
2. Entorno de programación Java
2. Paso de mensajes en Java: sockets
1. Introducción a sockets
2. Sockets en Java
1. Datagrama
2. Orientado a conexión
3. Difusión (comunicación en grupo)
![Page 4: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/4.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Paradigma de paso de mensajes
ARCOS @ UC3M4
Espacio de objetos, aplicaciones colaborativas
Servicios de red, object request broker, agentes móviles
procedimientos remotos, métodos remotos
Cliente-servidor, peer-to-peer
Paso de mensajes
alto
bajo
![Page 5: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/5.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Paradigma de paso de mensajes
ARCOS @ UC3M5
Paradigma fundamental para aplicaciones distribuidas
Un proceso envía un mensaje de solicitud
El mensaje llega al receptor, el cual procesa la solicitud y
devuelve un mensaje en respuesta
Esta respuesta puede originar posteriores solicitudes por parte del emisor
m1
m2
m3
Proceso A Proceso B
Mensaje
Paso de mensajes
![Page 6: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/6.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Paradigma de paso de mensajes
ARCOS @ UC3M6
Las operaciones básicas para soportar el paradigma de paso de mensajes son enviar y recibir
Protocolos más comunes: IP y UDP
Para las comunicaciones orientadas a conexión también se necesitan las operaciones conectar y desconectar
Protocolo más común: TCP
Operaciones de Entrada/Salida que encapsulan el detalle de la comunicación a nivel del sistema operativo
Ejemplo: el API de sockets
![Page 7: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/7.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M7
1. Introducción:
1. Paradigma de paso de mensajes
2. Entorno de programación Java
2. Paso de mensajes en Java: sockets
1. Introducción a sockets
2. Sockets en Java
1. Datagrama
2. Orientado a conexión
3. Difusión (comunicación en grupo)
![Page 8: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/8.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Java: programación
ARCOS @ UC3M8
Programación en Java.
Tipos de programas en Java.
Aplicaciones.
Applets.
Servlets.
Programa
Java
Código
bytecode
Código
máquina nativo
compilador JVM
Independiente de la plataforma
![Page 9: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/9.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Java: tipos de programas
ARCOS @ UC3M9
Computador
Objeto Java
JVM
Aplicación
Objeto Java
JVM
Applet
Solicitud
Respuesta
servlet
applet
Servlet
Proceso
![Page 10: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/10.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Java: características
ARCOS @ UC3M10
Java no tiene punteros
Recolector de basura
Java soporta programación multi-threading.
Riesgo de condiciones de carrera → regiones críticas.
Java ofrece soporte para crear
aplicaciones distribuidas
Diversas bibliotecas para uso de protocolos de comunicación
![Page 11: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/11.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Java: características
ARCOS @ UC3M11
![Page 12: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/12.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Empaquetamiento de datos
ARCOS @ UC3M12
Transformaciones necesarias para poder transmitir datos
o estructuras entre distintos ordenadores
“Prueba"
“Prueba"
1.2 7.3 -1.5
1.2
7.3
-1.5
110011 ... 10000100 ...
marshalling
unmarshalling
1. Aplanado de los campos de la estructura de datos
1. Conversión de los datos a la representación interna
2. Reconstrucción de las estructuras de datos
Computador A
Computador B
La conversión de la representación de interna a externano es necesaria si
- Ambos extremos son el mismo tipo de computador- Los dos extremos negocian una conexión.
2. Conversión a la representación externa (de red)
![Page 13: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/13.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Java: comunicación de datos y objetos
ARCOS @ UC3M13
Java soporta la serialización de objetos.
Empaquetamiento y transmisión de objetos
entre procesos.
theFile = new File(args[0]);outStream = new FileOutputStream(theFile); objStream = new ObjectOutputStream(outStream); ... objStream.writeInt(3); objStream.writeObject(new Crouton(7)); objStream.writeObject(new Tomato("Mars", 11, 5))... int primitive = objStream.readInt(); crunch = (Crouton) objStream.readObject(); Object tomato = objStream.readObject();
![Page 14: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/14.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M14
1. Introducción:
1. Paradigma de paso de mensajes
2. Entorno de programación Java
2. Paso de mensajes en Java: sockets
1. Introducción a sockets
2. Sockets en Java
1. Datagrama
2. Orientado a conexión
3. Difusión (comunicación en grupo)
![Page 15: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/15.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Sockets: introducción
ARCOS @ UC3M15
Aparecieron en 1981 en UNIX BSD 4.2 Intento de incluir TCP/IP en UNIX
Diseño independiente del protocolo de comunicación
Abstracción que: Se representa un extremo de una comunicación bidireccional
con una dirección asociada
En el caso de sockets basados en TCP/UDP se tiene una dirección IP y un puerto
Ofrece interfaz de acceso a los servicios de red en el nivel de transporte
Protocolo TCP
Protocolo UDP
Otros…
![Page 16: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/16.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Sockets: introducción
ARCOS @ UC3M16
Sujetos a proceso de estandarización dentro de POSIX
POSIX 1003.1g
Actualmente:
Disponibles en casi todos los sistemas UNIX
Disponibles en otros sistemas operativos
WinSock: API de sockets de Windows
Accesible desde muchos lenguajes
En Java como clase nativa
![Page 17: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/17.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Tipos de sockets
ARCOS @ UC3M17
Datagrama sin conexión
Sin conexión.
No fiable, no se asegura el orden en la entrega.
Mantiene la separación entre mensajes.
Asociado al protocolo UDP.
Datagrama con conexión
Orientado a conexión (no a nivel de red, sino nivel lógico).
Fiable, se asegura el orden de entrega de mensajes.
No mantiene separación entre mensajes.
Asociado al protocolo UDP.
Sockets STREAM
Concepto de flujo de datos.
Asociado al protocolo TCP.
![Page 18: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/18.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Uso de sockets datagram
ARCOS @ UC3M18
Proceso 1 Proceso 2
Socket()
receivefrom()
close()
Peticiónsendto()
Obtener
streams
receivefrom()
Respuestasendto()
close()
![Page 19: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/19.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Uso de sockets stream
ARCOS @ UC3M19
Proceso 1
Proceso 2
socket
socket
listen
accept
read
close
connect
read
close
Peticiónwrite
Respuestawrite
Conexión
![Page 20: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/20.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M20
1. Introducción:
1. Paradigma de paso de mensajes
2. Entorno de programación Java
2. Paso de mensajes en Java: sockets
1. Introducción a sockets
2. Sockets en Java
1. Datagrama
2. Orientado a conexión
3. Difusión (comunicación en grupo)
![Page 21: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/21.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Sockets de Java
ARCOS @ UC3M21
El paquete java.net de Java permite
crear y gestionar sockets TCP/IP.
Clases para sockets datagrama:
DatagramSocket
DatagramPacket
Clases para sockets stream:
ServerSocket
Socket
![Page 22: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/22.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Sockets datagrama
ARCOS @ UC3M22
DatagramPacket:
implementa un objeto que permite enviar o recibir paquetes.
Constructor: DatagramPacket.
Métodos: getAddres, getPort, ...
DatagramSocket:
implementa un socket que se puede utilizar para
enviar o recibir datagramas.
Constructor: DatagramSocket.
Métodos: send, receive, close, setSoTimetout, getSoTimeout,...
![Page 23: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/23.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Sockets datagrama
ARCOS @ UC3M23
Vector de bytes
Objeto DatagramPacket
Dirección del
receptor
Objeto DatagramSocket
Proceso emisor
Vector de bytes
Proceso receptor
send
receive
Referencia a objeto
Flujo de datos
Objeto DatagramPacket
Objeto DatagramSocket
![Page 24: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/24.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Sockets datagrama
ARCOS @ UC3M24
// Ejemplo para un emisor
InetAddress receiverHost=
InetAddress.getByName ("localHost");
DatagramSocket theSocket = new DatagramSocket( );
String message = "Hello world!";
byte[ ] data = message.getBytes( );
DatagramPacket thePacket
= new DatagramPacket(data, data.length ,
receiverHost, 2345);
theSocket .send(thePacket );
//Ejemplo para un receptor
DatagramSocket ds = new DatagramSocket (2345);
DatagramPacket dp =
new DatagramPacket(buffer, MAXLEN );
ds.receive(dp);
len = dp.getLength ( );
System.out.Println (len + " bytes received.\n");
String s = new String( dp.getData ( ), 0, len);
System.out.println (dp.getAddress ( ) + " at port "
+ dp.getPort ( ) + " says " + s);
![Page 25: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/25.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Ejemplo (datagramas)
ARCOS @ UC3M25
NÚCLEO
clientesumar(5,2)
5+2
Restulado = 7
servidor
Máquina A Máquina B
NÚCLEO
RED
resultado = 7
![Page 26: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/26.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Emisor (datagramas)
ARCOS @ UC3M26
import java.lang.* ;
import java.io.* ;
import java.net.* ;
import java.util.* ;
public class client{
public static void main ( String [] args)
{
byte bsend[] = new byte[100];
byte brecv[] = new byte[100];
InetAddress server_addr = null;
DatagramSocket s = null;
DatagramPacket in = null;
DatagramPacket out = null;
int res; int num[] = new int[2];
if (args.length != 1) {
System.out.println("Uso: cliente <host>");
System.exit(0);
}
![Page 27: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/27.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Emisor (datagramas)
ARCOS @ UC3M27
try
{
// se crea el socket del cliente
s = new DatagramSocket();
// direción del servidor
server_addr = InetAddress.getByName(args[0]);
num[0] = 2;
num[1] = 5;
// empaquetar los datos.
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
ObjectOutputStream dos = new ObjectOutputStream(baos);
dos.writeObject(num);
bsend = baos.toByteArray() ; // se obtiene el buffer (datagrama)
// un único envio
out = new DatagramPacket(bsend, bsend.length, server_addr, 2500);
s.send(out);
// Excerpt from the sending process
InetAddress receiverHost =
InetAddress.getByName ("localHost ");
DatagramSocket theSocket = new DatagramSocket ( );
String message = "Hello world!";
byte[ ] data = message.getBytes ( );
DatagramPacket thePacket
= new DatagramPacket (data , data.length ,
receiverHost , 2345);
theSocket .send (thePacket );
![Page 28: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/28.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Emisor (datagramas)
ARCOS @ UC3M28
// se recibe el datagrama de respuesta
in = new DatagramPacket(brecv, 100);
s.receive(in);
// se obtiene el buffer
brecv = in.getData();
// se desempaqueta
ByteArrayInputStream bais = new ByteArrayInputStream(brecv) ;
DataInputStream dis = new DataInputStream(bais);
res = dis.readInt();
System.out.println("Datos recibidos " + res);
}
catch (Exception e) {
System.err.println("<<<<<excepcion " + e.toString() );
e.printStackTrace() ;
}
}
}
//Excerpt from a receiver programDatagramSocket ds = new DatagramSocket(2345);DatagramPacket dp =
new DatagramPacket(buffer, MAXLEN );ds.receive(dp);len = dp.getLength ( );System.out.Println(len + " bytes received.\n");String s = new String( dp.getData( ), 0, len);System.out.println (dp.getAddress ( ) + " at port "
+ dp.getPort( ) + " says " + s);
![Page 29: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/29.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Receptor (datagramas)
ARCOS @ UC3M29
import java.lang.* ;
import java.io.* ;
import java.net.* ;
import java.util.* ;
public class servidor
{
public static void main ( String [] args)
{
DatagramSocket s = null;
DatagramPacket in, out;
InetAddress client_addr = null;
int client_port;
byte brecv[] = new byte[100];
byte bsend[] = new byte[100];
int num[], res;
try {
s = new DatagramSocket(2500);
in = new DatagramPacket(brecv, 100); // paquete para recibir la // solicitud
![Page 30: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/30.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Receptor (datagramas)
ARCOS @ UC3M30
//Excerpt from a receiver programDatagramSocket ds = new DatagramSocket(2345);DatagramPacket dp =
new DatagramPacket(buffer, MAXLEN );ds.receive(dp);len = dp.getLength ( );System.out.Println(len + " bytes received.\n");String s = new String( dp.getData( ), 0, len);System.out.println (dp.getAddress ( ) + " at port "
+ dp.getPort( ) + " says " + s);
while (true)
{
s.receive(in); //esperamos a recibir
brecv = in.getData(); // obtener datos
client_addr = in.getAddress();
client_port = in.getPort();
// desempaquetar los datos.
ByteArrayInputStream bais = new ByteArrayInputStream(brecv);
ObjectInputStream dis = new ObjectInputStream(bais);
num = (int[])dis.readObject(); res = num[0] + num[1];
![Page 31: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/31.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Receptor (datagramas)
ARCOS @ UC3M31
// Excerpt from the sending process
InetAddress receiverHost =
InetAddress.getByName ("localHost ");
DatagramSocket theSocket = new DatagramSocket ( );
String message = "Hello world!";
byte[ ] data = message.getBytes ( );
DatagramPacket thePacket
= new DatagramPacket (data , data.length ,
receiverHost , 2345);
theSocket .send (thePacket );
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
DataOutputStream dos =
new DataOutputStream(baos);
dos.writeInt(res);
bsend = baos.toByteArray();
out = new DatagramPacket(bsend, bsend.length, client_addr, client_port);
s.send(out);
}
}
catch(Exception e) {
System.err.println("excepcion " + e.toString() );
e.printStackTrace() ;
}
}
}
![Page 32: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/32.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M32
1. Introducción:
1. Paradigma de paso de mensajes
2. Entorno de programación Java
2. Paso de mensajes en Java: sockets
1. Introducción a sockets
2. Sockets en Java
1. Datagrama
2. Orientado a conexión
3. Difusión (comunicación en grupo)
![Page 33: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/33.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Sockets stream
ARCOS @ UC3M33
La clase socket implementa un socket stream
Socket(InetAddress dirección, int puerto)
OutputStream getOutputStream()
flush,
InputStream getInputStream()
Void setSoTimeout(int tiempo_de_espera)
La clase ServerSocket implementa un socket a utilizar en los servidores
para esperar la conexiones de los clientes
Socket accept()
Void close()
Void setSoTimeout(int tiempo_de_espera)
![Page 34: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/34.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Esqueleto con sockets streams de Java
ARCOS @ UC3M34
Emisor ServerSocket(puerto);
accept();socket(host, puerto)
OutputStream
OutputStream
InputStream
InputStream
close() close()
Receptor
![Page 35: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/35.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Esqueleto con sockets streams de Java
ARCOS @ UC3M35
Proceso emisor
Proceso receptor
ServerSocket()
Abrir conexiónSocket() Accept()
Obtener
streams
read()
close()
Peticiónwrite()
Obtener
streams
Crear
Thread
Accept()
read()
Respuestawrite()
close()
![Page 36: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/36.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Ejemplo (streams)
ARCOS @ UC3M36
NÚCLEO
clientesumar(5,2)
5+2
Restulado = 7
servidor
Máquina A Máquina B
NÚCLEO
RED
resultado = 7
![Page 37: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/37.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Emisor (streams)
ARCOS @ UC3M37
import java.lang.* ;
import java.io.* ;
import java.net.* ;
import java.util.* ;
public class client
{
public static void main ( String [] args)
{
int res;
int num[] = new int[2];
if (args.length != 1) {
System.out.println("Uso: cliente <host>");
System.exit(0);
}
try { // se crea la conexión
String host = args[0];
Socket sc = new Socket(host, 2500); // conexión
![Page 38: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/38.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Emisor(streams)
ARCOS @ UC3M38
OutputStream ostream = sc.getOutputStream();
ObjectOutput s = new ObjectOutputStream(ostream);
num[0] = 5; num[1] = 2; //prepara la petición
s.writeObject(num);
s.flush();
DataInputStream istream = new DataInputStream(sc.getInputStream());
res = istream.readInt();
sc.close();
System.out.println("La suma es " + res);
}
catch (Exception e){
System.err.println("excepcion " + e.toString() );
e.printStackTrace() ;
}
}
}
![Page 39: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/39.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Receptor (streams)
ARCOS @ UC3M39
import java.lang.* ;
import java.io.* ;
import java.net.* ;
import java.util.* ;
public class servidor
{
public static void main ( String [] args)
{
ServerSocket serverAddr = null;
Socket sc = null;
int num[] ; // petición
int res;
try {
serverAddr = new ServerSocket(2500);
}
catch (Exception e){
System.err.println("Error creando socket");
}
![Page 40: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/40.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Receptor (streams)
ARCOS @ UC3M40
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];
DataOutputStream ostream = new DataOutputStream(sc.getOutputStream());
ostream.writeInt(res);
ostream.flush();
sc.close();
} catch(Exception e) {
System.err.println("excepcion " + e.toString() );
e.printStackTrace() ;
}
} // while
} // main
} // servidor
![Page 41: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/41.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Contenidos
ARCOS @ UC3M41
1. Introducción:
1. Paradigma de paso de mensajes
2. Entorno de programación Java
2. Paso de mensajes en Java: sockets
1. Introducción a sockets
2. Sockets en Java
1. Datagrama
2. Orientado a conexión
3. Difusión (comunicación en grupo)
![Page 42: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/42.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Comunicación en grupo
ARCOS @ UC3M42
IPC en grupo o multidifusión.
Demanda:
Aplicaciones.
Aumento de la robustez del sistema.
emisor receptor
IPC uno-a-uno
IPC grupo o multidifusión
![Page 43: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/43.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Comunicación en grupo
ARCOS @ UC3M43
Operaciones primitivas: Incorporación
Abandono
Envío
Recepción
Multidifusión: Sin conexión: baja latencia.
Audio/vídeo en tiempo real.
Orientada a conexión: alta latencia. Multidifusión de datos.
![Page 44: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/44.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Tipos de sistemas de multidifusión
ARCOS @ UC3M44
No fiable
Fiable
Sin orden
Los mensajes no tienen orden entre procesos, y los de un mismo proceso
FIFO
Se mantiene el orden de los mensajes de un mismo proceso
(distintos entrelazados)
Orden casual
Relación sucede-antes/casual entre todos los mensajes
Orden atómico
Relación sucede-antes/casual entre ciertos mensajes
![Page 45: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/45.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Ejemplos de los distintos
tipos de sistemas de multidifusión
ARCOS @ UC3M45
Sin orden
Se emiten m1, m2, m3
m1-m2-m3, m1-m3-m2, m2-m1-m3, m2-m3-m1, m3-m1-m2, m3-m2-m1
FIFO
A emite A1-A2 y B emite B1-B2
A1-A2-B1-B2,
A1-B1-A2-B2,
A1-B1-B2-A2,
B1-A1-A2-B2
B1-A1-B2-A2
B1-B2-A1-A2.
Orden casual
A emite A1, B emite B1, A emite -A2 y B emite B2
A1-A2-B1-B2,
![Page 46: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/46.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Ejemplos de los distintos
tipos de sistemas de multidifusión
ARCOS @ UC3M46
Orden atómico:
Ejemplo 1:
P1 envía m1, P2 envía m2, y P3 envía m3.
m1-m2- m3, m1- m3- m2, m2- m1-m3,
m2-m3-m1, m3-m1- m2, m3-m2-m1.
Ejemplo 2:
P1 envía m1 y luego m2.
P2 responde a m1 enviando m3.
P3 responde a m3 enviando m4
Orden a respetar: m1 - m3 - m4
m1- m2- m3- m4, m1- m3- m2- m4, m1- m3- m4- m2.
![Page 47: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/47.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Multidifusión en Java
ARCOS @ UC3M47
Extensión del protocolo UDP.
Multidifusión no fiable.
Ofrece clases próximas a las APIs de sockets:
InetAddress: identifica grupo de multidifusión.
DatagramPacket: paquete de datos enviado a todos los participantes y
paquete de datos recibido por cada participante.
MulticastSocket: permite gestionar sockets multidifusión.
Dirección IP de multidifusión:
Direcciones de multidifusión del protocolo de internet.
Dirección IP de clase D: 224.0.0.0 a 239.255.255.255.
Número de puerto UDP.
![Page 48: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/48.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Direcciones de multidifusión asignadas
ARCOS @ UC3M48
224.0.0.1 All Systems on this Subnet
224.0.0.11 Mobile-Agents 224.0.1.23 XINGTV
224.0.1.84 jini-announcement
224.0.1.85 jini-request
224.0.1.115 Simple Multicast
224.0.6.000-224.0.6.127 Cornell ISIS Project
224.0.7.000-224.0.7.255 Where-Are-You
224.0.8.000-224.0.8.255 INTV
224.0.9.000-224.0.9.255 Invisible Worlds
2240.12.000-224.0.12.063 Microsoft and MSNBC
224.0.18.000-224.0.18.255 Dow Jones
224.0.19.000-224.0.19.063 Walt Disney Company
224.0.22.000-224.0.22.255 WORLD MCAST
224.2.0.0-224.2.127.253 Multimedia Conference Calls
![Page 49: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/49.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Multidifusión en Java
ARCOS @ UC3M49
Incorporación a un grupo de multidifusión// Unirse a la dirección 239.1.2.3 puerto 3456
InetAddress group = InetAddress.getByName("239.1.2.3")
MulticastSocket s = new MulticastSocket(3456)
s.joinGroup(group);
Envío a un grupo de multidifusiónString msg = “Mensaje de difusión.";
InetAddress group = InetAddress.getByName("239.1.2.3");
MulticastSocket s = new MulticastSocket(3456);
s.joinGroup(group); // opcional
DatagramPacket hi = new DatagramPacket(msg.getBytes(),
msg.length(),group, 3456);
s.send(hi);
![Page 50: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/50.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Multidifusión en Java
ARCOS @ UC3M50
Recepción de mensajes enviadosbyte[] buf = new byte[1000];
InetAddress group =InetAddress.getByName("239.1.2.3");
MulticastSocket s = new MulticastSocket(3456);
s.joinGroup(group);
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
Abandono de un grupo de multidifusións.leaveGroup(group);
![Page 51: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/51.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Multidifusión en Java
ARCOS @ UC3M51
Tiempo de vida
Objetivo: evitar que los mensajes circulen indefinidamente.
Número de enlaces a través de los que se retransmite el paquete.
String msg = “Hola!";
InetAddress group = InetAddress.getByName("224.0.0.1");
MulticastSocket s = new MulticastSocket(3456);
s.setTimeToLive(1); // multidifusión en máquinas locales
DatagramPacket hi = new DatagramPacket(msg.getBytes(),
msg.length(),group, 3456);
s.send(hi);
![Page 52: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/52.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Multidifusión en Java
ARCOS @ UC3M52
Valores del tiempo de vida:
0 <= tiempo_de_vida <= 255
0 misma máquina
1 misma red local
32 misma zona
64 misma región
128 mismo continente
255 no está restringida
![Page 53: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/53.jpg)
Félix García Carballeira, Alejandro Calderón Mateos
Multidifusión en Java
ARCOS @ UC3M53
Interfaces de multidifusión fiable:
The Java Reliable Multicast Service (JRM Service).
SistemaTotem de la Universidad de California.
TASC’s Reliable Multicast Framework (RMF)
Multidifusión FIFO.
![Page 54: Paso de mensajes en Java - acaldero.github.io](https://reader035.fdocuments.ec/reader035/viewer/2022071006/62c89febba9e5968922ae275/html5/thumbnails/54.jpg)
Paso de mensajes en Java
Grupo ARCOS
Desarrollo de Aplicaciones Distribuidas
Ingeniería Informática
Universidad Carlos III de Madrid