Socket Datagrama
Introducción
Los sockets son una puerta entre procesos de aplicación y
el protocolo de transporte que se usa de extremo ya sea TCP o UDP, el tipo de
protocolo también definirá el tipo de socket, nos permiten establecer enlaces
entre programas que se ejecutan de manera independiente (programa cliente y
programa servidor). En si se podría decir que un socket es un canal de comunicación
entre dos programas. Hay dos tipos de sockets, los que están orientados a conexión
y los que no, esto dependerá de sus atributos.
Las interfaces de programación de sockets, como lo son el
API de sockets de java y demás, proporcionan constructores que hacen uso de un
protocolo. Usan dos protocolos UDP, en este caso son conocidos como Sockets
datagrama, o TCP, y son conocidos como socket stream.
Un socket se identifica por 3 características principales:
Su dominio (El medio de comunicación de red que el socket utilizara), el
protocolo que utiliza y el tipo que definirá si es un socket datagrama o un
socket stream, este último se hace en base al protocolo que utiliza.
Protocolo y funcionalidades del Socket Datagrama
Un socket datagrama está diseñado para admitir un flujo
de datos en dos direcciones, el socket datagrama es responsable de la secuencia
y de la confiabilidad de administrar. La confiabilidad que ofrece un socket
datagrama es bastante buena en redes LAN.
Estos sockets son los que usan el modelo UDP (protocolo
de diagrama de usuario), El modelo UDP
permite: “un paquete se transporte (es decir, se envié o reciba en el nivel de
transporte) utilizando comunicaciones sin conexión “ (Liu, 2004) . Este tipo de
sockets pueden dar soporte tanto a una comunicación sin conexión como a una
orientada a conexión pero a nivel aplicación. Al mandar datos o recibirlos
usando la API de sockets se debe instanciar la clase datagramsocket, esta clase
esta enlazada al puerto UDP de la máquina, lo cual la hace local al proceso.
Para intercambiar un datagrama entre un programa emisor y
un programa receptor: Para intercambiar un datagrama de un proceso a otro
proceso se ocupa la clase DatagramPacket, en estos se debe englobar la dirección
del destinatario y una referencia al vector de octetos que contiene los datos
de carga, tanto el emisor como el receptor deben instanciar el DatagramPacket y
el DatagramSocket en este proceso. El programa receptor solo especifica el vector
de datos en el DatagramPacket mientras que el emisor debe especificar los datos
y la dirección del receptor.
Características del socket datagrama
Estos datagramas no prometen que la información enviada
sea de manera ordenada, tampoco garantizan protección o que no se dupliquen los
datos, los límites del registro son los encargados de solucionar esto último,
ya que se conservaran los límites de registro en los datos mientras los
registros sean menores al límite interno del tamaño del receptor.
Algunas de sus características son:
- · No perder datos durante la transmisión
- · Conservación de los límites de los mensajes enviados
- · Puede haber mensajes urgentes que permiten el envió de datos fuera de flujo de banda y que son accesibles de inmediato.
Otras de sus características según el Cinvestav son:
- · El que no necesita de un saludo como si lo hace el socket stream
- · El emisor asocia explícitamente la dirección IP y el puerto de destinatario
- · El servidor debe extraer del datagrama recibido, la dirección IP y el puerto del emisor
El uso de los sockets datagrama en un sentido orientado a
conexión es poco común, lo habitual es usar socket stream, pero aun así las
clase DatagramSocket ofrece métodos que permiten crear y terminar conexiones,
para realizar esta conexión se necesita especificar la dirección de un socket
remoto y también la dirección del socket desde el cual se enviaran los datos
por lo que el socket solo estará disponible para comunicarse con ese solo
socket hasta que la conexión se termine.
Pasos para el envió de un datagrama
En el programa emisor:
Se crea un socket datagrama y se enlaza al puerto local, sitúa
los datos en octetos, crea un paquete datagrama, especificando el vector de
datos y la dirección del receptor, invoca al método receptor del socket con una
referencia al paquete datagrama.
Ejemplo de código de un emisor
inport java.net.*;
inport java.io.*;
public class EjemplolEmisor {
public static void main(String[ ] args) {
if
(args. length != 3)
System.out.println
("Este programa requiere 3 argumentos de linea de mandato");
else {
try
{
InetAddress
maquinaReceptora = InetAddress. getByName (args [ 0 ]);
int
puertoReceptor = Integer.parselnt(args[1]);
String mensaje
= args[2];
DatagramSocket
miSocket = new DatagramSocket ( );
byte[ ]
almacén = mensaje.getBytes( );
DatagramPacket
datagrama =
new DatagramPacket(almacén,
almacén.length, maquinaReceptora, puertoReceptor);
miSocket.send(datagrama);
miSocket.cióse(
);
}catch(Exception
ex){
ex.printStackTrace(
) ;
}//fin
del catch
}//fin del else
}//fin de main
}//fin de class
*Código proveniente de (Liu, 2004) .
Al analizar este código podemos ver que se piden 3
argumentos, el primero será la dirección de la maquina receptora, el 2 el
puerto de recepción y el 3 el mensaje. Se instancia a un socket ya creado y se
almacena el mensaje guardado en bytes, la dirección, el puerto y el mensaje se
guardan en un DatagramPacket y empleando el método send del socket instanciado
es enviado al receptor y finalmente se cierra el objeto socket
En el programa receptor:
Se crea un socket datagrama y se enlaza a un puerto local
especifico, esto ya que el programa emisor necesita una dirección en específico,
se crea un vector de octetos para recibir los datos, crea el paquete datagrama
especificando al vector de datos y luego invoca al método receptor con una
referencia al paquete datagrama.
Ejemplo de código de un receptor
Ejemplo de código de un receptor
inport java.net.*;
inport java.io.*;
public class EjemploReceptor {
public static void main(String[ ] args) {
if
(args. length != 1)
System.out.println
("Este programa requiere un argumentos de linea de mandato");
else {
int
puerto = Integer.parselnt(args[0 ]);
final int
MAX_LON = 1 0 ;
try {
DatagramSocket
miSocket = new DatagrairSocket (puerto);
b y t e [ ] a
lm a c é n = new b y t e [ MAX_L0N ] ;
DatagramPacket
datagrama = new DatagramPacket (almacén, MAX_LON);
miSocket.
receive (datagrama);
String mensaje
= new String(almacén);
System.
out.println(mensaje);
miSocket.cióse(
);
} // fin de
try
catch
(Exception ex) {
ex.printStackTrace(
);
}//fin
del catch
}//fin del else
}//fin de main
}//fin de class
*Código proveniente de (Liu, 2004) .
En este código también se instancia un socket y se usa el
método receive en este para recibir lo que envió el programa emisor y el
argumento que se pide esta vez (solo se pide uno) es del puerto en donde
arribara el mensaje, se recibe y convierte a String y luego se imprime.

API de sockets
Como ya se mencionó anteriormente en el uso de sockets se
usa una API que contiene 2 clases necesarias para el uso del DatagramSocket en
el envió del mensaje las cuales son:
DatagramSocket
Esta clase representa un socket que envía y recibe
paquetes datagrama, es el punto de envió y recibo del servicio de entrega de
paquetes, cada paquete enviado o recibido se le asigna una ruta de manera
individual, al ser enviados múltiples paquetes de una maquina a otra se tomaran
rutas diferentes y probablemente lleguen en diferente orden.
En si maneja sockets para enviar y recibir datagramas UDP
y proporciona los constructores para esto como lo son DatagramSocket(),
DatagramSocket(int port) y DatagramSocket(int port, InetAddress laddr).
Los métodos de mayor importancia que proporciona esta
clase y que serán importantes para mandar datagramas son:
- send(DatagramaPacket p): Esta sirve para transmitir el datagrampacket conteniendo el mensaje
- receive(DatagramPacket p): en él se coloca el mensaje, su longitud y su origen
- setSoTimeout(int timeout): Este método permite imponer un tiempo de espera limite que no debe ser rebasado.
- Connect(InetAddress address, int port): Este método se usa para conectarse a un puerto remoto y a una dirección de internet concreta.
Cabe mencionar que estos métodos sirven para transmitir
datagaramas entre dos conectores
DatagramPacket
Los paquetes datagrama son usado para implementar un servicio
de envió sin necesidad de una conexión, cada mensaje es ruteado de una maquina
a otra basado solamente en la información contenida en el paquete. Los paquetes
pueden llegar en un orden distinto por las razones que ya se mencionaron en
DatagramSocket. Esta clase proporciona los creadores para crear instancias a
partir de los datagramas que se reciban y crear instancias que serán enviadas.
Conclusiones
Los sockets datagrama son una herramienta muy útil en los sistemas distribuidos a la hora de crear una comunicación entre dos programas sin que se requiera conexión y gracias a las APIs ofrecidas por java es sencillo trabajar con ellos por lo que son de mucha utilidad al empezar a hacer un sistema distribuido ya que solo hace falta conocer bien la estructura de los DatagramSocket y Datagrampacket que se emplearan tanto en el programa receptor como en el emisor. Los sockets datagrama también se pueden emplear en una comunicación orientada a conexión, pero en estos casos es mejor emplear los sockets stream ya que si bien se pueden emplear de esta manera cuando se trata de una comunicación orientada a conexión los sockets stream
tienen mayores ventajas.
Bibliografía
CINVESTAV. (15 de Octubre de 2017). Cinvestav.
Recuperado el 15 de Octubre de 2017, de Programacion en Internet (Sockets):
http://www.tamps.cinvestav.mx/~vjsosa/clases/sd/Sockets_C_Java_ppt.pdf
Liu, M. L. (2004). Computacion
distribuida fundamentos y aplicaciones. San Luis Obispo, California:
Pearson.
Martín Santana, A. D.,
& Martínez Santana, L. I. (15 de Agosto de 2007). La web de Sistemas
Operativos (SOPA). Recuperado el 15 de Octubre de 2017, de COMUNICACIÓN ENTRE
PROCESOS SOCKETS:
http://sopa.dis.ulpgc.es/ii-dso/leclinux/ipc/sockets/sockets.pdf
Univeridad carlos III de
madrid. (15 de Octubre de 2017). Univeridad carlos III de madrid.
Recuperado el 2017 de Octubre de 2017, de Trabajando con Sockets UDP: http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsUDP/


No hay comentarios:
Publicar un comentario