A08 Presentacion Tema 3-El API de Sockets Java
A08 Presentacion Tema 3-El API de Sockets Java
Distribuidas
3º Grado en I. de Tecnologías de Telecomunicación
Tema 3:
El API de Sockets en Java
3 de octubre de 2022
2
2. La metáfora de sockets en IPC
• El nombre de socket (enchufe en castellano)
deriva de los tiempos en los que operadoras
telefónicas conectaban cables en un panel de
sockets.
Proceso A Proceso B
Socket en Socket en
puerto p1 puerto p2
un socket
3
3. El API de sockets
El API de socket permite:
– Datagram Sockets (UDP), servicio no orientado a
conexión. Son los más sencillos, y son los que
emplearemos en la asignatura.
4
Identificación: analogía en direcciones postales normales
Carta
nombre remite
dirección remite
nombre destino
dirección destino
carta -- datagrama UDP
sobre – cabecera del datagrama UDP
escrito dentro del sobre -- mensaje
Datagrama UDP
nombre remitente -- puerto origen
puerto origen, puerto destino, ….
nombre destinatario -- puerto destino
….,IP origen, IP destino, …
dirección remitente -- IP origen
datos (mensaje)
dirección destinatario -- IP destino
5
Identificación: otra analogía
Reducimos nuestro mundo a los colegios mayores de Valladolid.
• Los colegiales representan a procesos.
• Los colegios mayores representan a ordenadores conectados a Internet con IP pública.
Hay colegiales que quieren poder enviar cartas a otros colegiales gestionándose el envío por el
colegio mayor, y colegiales que no desean ese servicio.
• Los colegiales que quieren enviar cartas son procesos que se comunican a través de
Internet.
• Los otros colegiales son procesos que no hacen uso de Internet.
Cuando un colegial que reside en el colegio decide que a partir de entonces desea comunicarse,
solicita un casillero al colegio mayor. El casillero tendrá un número.
• El colegial puede pedir un casillero que esté libre, y el servicio de comunicaciones del
colegio le asignará uno libre. Lo mismo les ocurre a los procesos, siendo el servicio de
comunicaciones del colegio el sistema operativo sobre el que se está ejecutando el proceso,
siendo el casillero el socket a través del cual se comunicará el proceso, y siendo el número
del casillero el número de puerto que ha reservado el proceso.
• También puede pedir un casillero concreto, pero si está ocupado, el servicio de
comunicaciones del colegio le indicará “ese casillero está ocupado”. Entonces el colegial
podrá pedir otro concreto, con la posibilidad de que se produzca el mismo suceso, u otro
libre. Lo mismo le ocurre a los procesos, siendo la equivalencia de cada uno de los
elementos, la indicada en el punto anterior.
Suponemos que los casilleros tienen dos zonas, la zona izquierda para recepciones, y la zona derecha
para envíos.
• El colegial pude pedir ir a ver si ha recibido algo en la zona de envíos muy frecuentemente,
o cada mucho tiempo, pero a costa de leer con retraso los mensajes. Lo mismo les ocurre
con los procesos, que no se percatan de si han recibido un mensaje hasta que no consultan
su socket.
• Un colegial que quiere enviar una carta, la deposita en su casillero en la zona de envíos,
indicando en el sobre el colegio y número de casillero del amigo con el que desea
comunicarse. El servicio de comunicaciones del colegio rellenará el remite, que será número
de casillero y colegio del colegial, y lo enviará. Lo mismo ocurre a los procesos, que sólo
deben indicar números de puerto e IP destinos, ya que el origen lo rellenará el sistema
operativo, el cual también enviará el datagrama IP.
Identificación
Los sockets permiten comunicar un proceso de un ordenador (o
cualquier máquina) origen, con otro proceso de otra máquina
destino.
• Los ordenadores se identifican dentro de Internet mediante su dirección
IP, que será única dentro de la red Internet.
• Los procesos se identificarán dentro de todos los que se ejecutan
simultáneamente en cada ordenador mediante el protocolo de la capa de
transporte (UDP/TCP) y su número de puerto, que deberá ser único,
pues el sistema operativo no permite que dos procesos reserven para sí
el mismo puerto, siempre que utilicen el mismo protocolo.
PROCESO 1 PROCESO 2
Puerto Puerto
origen destino
ORDENADOR ORDENADOR 8
Dirección IP origen Dirección IP destino
Ejemplos de casos posibles de comunicación entre dos
aplicaciones:
157.88.130.34:1000 ----- 192.168.220.230:355
Situación que corresponde dos procesos que corren cada uno de ellos en un
ordenador. Situación típica. Ambos procesos podrán comunicarse mediante sockets.
157.88.130.34:1000 ----- 192.168.220.230:1000
Situación que corresponde a dos procesos que corren cada uno de ellos en un
ordenador. Se da la coincidencia de que ambos procesos reservaron del sistema
operativo el mismo puerto, pero cada uno en su ordenador. Situación no típica, pero
posible y válida. Ambos procesos podrán comunicarse mediante sockets.
157.88.130.34:1000 ----- 157.88.130.34:355
Situación que corresponde a procesos que se ejecutan en el mismo ordenador. Cada
uno de ellos reservó un puerto al sistema operativo, y el sistema operativo se le
concedió. Situación válida. Ambos procesos podrán comunicarse mediante sockets.
157.88.130.34:1000 ----- 157.88.130.34:1000
Situación que corresponde a un proceso que se comunica consigo mismo en el
mismo ordenador. Aunque es posible, se puede considerar que no tiene sentido
utilizar sockets para que un proceso se comunique consigo mismo.
9
Datagramas UDP, o segmentos UDP
Pseudo-cabecera
14
Constructores representativos
de la clase DatagramPacket
Típicamente se emplearán dos constructores:
try{
Instrucción 1 que requiere manejo de excepciones
…
Instrucción N que requiere manejo de excepciones
}
catch{
ex.printStackTrace()
}
19
Clase Receptor (código fuente)
import java.net.*;
public class Receptor {
public static void main(String[] args) {
try{
DatagramSocket socketReceptor = new
DatagramSocket(2001);
byte[] almacen = new byte[20];
DatagramPacket paqueteEnReceptor=new DatagramPacket
(almacen, almacen.length);
socketReceptor.receive(paqueteEnReceptor);
System.out.println("El mensaje recibido es "+
new String(almacen));
socketReceptor.close();
} // end try
catch (Exception ex){
ex.printStackTrace();
}//end catch
}//end main
}//end class
20
Clase Emisor (código fuente)
import java.net.*;
public class Emisor {
public static void main(String[] args) {
try{
DatagramSocket socketEmisor = new
DatagramSocket(2000);
String mensaje="Clase de DAD";
byte[] datos=mensaje.getBytes();
DatagramPacket paqueteAEnviar=new DatagramPacket
(datos, datos.length,
InetAddress.getByName("192.168.120.220"), 2001);
socketEmisor.send(paqueteAEnviar);
socketEmisor.close();
} // end try
catch (Exception ex){
ex.printStackTrace();
}//end catch
}//end main
}//end class 21
Métodos bloqueantes
El método receive() de la clase DatagramSocket es bloqueante, mientras que el método
send() de la misma clase es no bloqueante.
22