0% encontró este documento útil (0 votos)
23 vistas

Socket en Java

Este documento describe las clases Java DatagramPacket y DatagramSocket, que permiten establecer comunicaciones mediante datagramas utilizando el protocolo UDP. DatagramPacket encapsula los datos y la información de destino de un datagrama, mientras que DatagramSocket proporciona métodos para enviar y recibir datagramas.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
23 vistas

Socket en Java

Este documento describe las clases Java DatagramPacket y DatagramSocket, que permiten establecer comunicaciones mediante datagramas utilizando el protocolo UDP. DatagramPacket encapsula los datos y la información de destino de un datagrama, mientras que DatagramSocket proporciona métodos para enviar y recibir datagramas.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 4

Las clases Java DatagramPacket y DatagramSocket

Lenguajes y Herramientas de Programaci


on
Universidad de La Laguna
Programa de Doctorado de Fsica e Informatica
Escuela Tecnica Superior Superior de Ingeniera Informatica
Dpto. Sistemas Informaticos y Computacion
2004-2005
Resumen
El objetivo de esta sesion es mostrar el modo de funcionamiento de las clases Java
para definir sockets utilizando el protocolo udp.

1.

Introducci
on

Las redes actuales utilizan el packet switching para la transferencia de datos. Los datos
se envuelven en paquetes que se transfieren desde un origen a un destino, donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje original.
Los nodos que se comunican a traves de Internet utilizan principalmente dos protocolos:
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunicaciones en la que no se garantiza una transmision fiable (reliable). udp no esta orientado a
conexion, por lo tanto no garantiza la entrega. udp enva paquetes de datos independientes,
denominados datagramas, desde una aplicacion a otra.
El envo de datagramas es similar a enviar una carta a traves del servicio postal: El
orden de salida no es importante y no esta garantizado, y cada mensaje es independiente
de cualquier otro.
En las comunicaciones basadas en datagramas como las udp, el paquete de datagramas
contiene el n
umero de puerto de su destino y udp encamina el paquete a la aplicacion
apropiada, como ilustra la figura 1.
El API Java para udp proporciona una abstracion del paso de mensajes, esto es,
la forma mas simple de comunicacion entre ordenadores. Esto hace posible a un proceso
emisor transmitir un u
nico mensaje a un proceso receptor. Los paquetes independientes
que contienen esos mensajes se denominan datagramas. En Java, el emisor especifica el
destino usando un socket (una referencia indirecta a un puerto particular usada por el
proceso receptor en la maquina receptora).
1

Herramientas y Lenguajes de Programacion 04-05

Figura 1:

Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a un


proceso receptor sin reconocimiento o recomprobaciones. Si tiene lugar un fallo, el mensaje
puede no llegar. Un datagrama es transmitido entre procesos cuando un proceso lo enva
y otro proceso lo recibe. Cualquier proceso que necesite enviar o recibir mensajes debe en
primer lugar crear un socket a un direccion de Internet y a un puerto local. Un servidor
enlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de manera
que puedan enviar mensajes al mismo. Un cliente enlaza su socket a cualquier puerto local
libre. El metodo receptor devuelve la direccion de Internet y el puerto del emisor, ademas
del mensaje, permitiendo a los receptores enviar una respuesta.
Las clases Java para establecer comunicaciones mediante datagramas son: DatagramPacket
y DatagramSocket.

2.

La clase DatagramPacket

La clase DatagramPacket proporciona un constructor que permite crear instancias de


un array de bytes parar: el mensaje, la longitud del mensaje, la direccion Internet y el
puerto local del socket de destino, de la siguiente forma:

array de bytes que contiene el mensaje

longitud del mensaje

direcci
on Intenet

n
umero de puerto

Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando un
proceso los enva y otro los recibe.
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje. Sus
argumentos especifican un array de bytes en el que recibir el mensaje y la longitud del
array. Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitud,
la direccion de Internet y el puerto del socket de envo.
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData().
Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internet
del objeto de tipo DatagramPacket.

Herramientas y Lenguajes de Programacion 04-05

El proceso receptor del mensaje tiene que especificar un array de bytes de un tama
no
determinado en el cual recibir el mensaje, esto es, ha de predecir el Tama
no del Mensaje. Si
el mensaje es muy grande para el array se trunca cuando llega. El protocolo ip subyacente
permite longitudes de paquetes de mas de 216 bytes, que incluye tanto las cabeceras como
los mensajes. Sin embargo, la mayora de los entornos imponen una restriccion en el tama
no
a 8 kilobytes. Cualquier aplicacion que necesite mensajes mayores que el maximo, debe
fragmentarlos en pedazos de ese tama
no. Generalmente, una aplicacion decidira sobre un
tama
no que no sea excesivamente grande pero que se adecue a su uso previsto.

3.

La clase DatagramSocket

La clase DatagramSocket da soporte a sockets para el envo y recepcion de datagramas


udp.
Se proporciona un constructor que toma un puerto como argumento, para que sea
usado por los procesos que necesitan usar un puerto particular. Tambien se proporciona
un constructor sin argumentos que permite al sistema escoger un puerto local libre. Estos
constructores pueden lanzar una excepcion del tipo SocketException si el puerto ya
esta en uso o si esta reservado.
Esta clase cuenta con los siguientes metodos:
send() y receive().
Estos metodos permiten transmitir datagramas entre un par de sockets. El argumento del send es una instancia de un DatagramPacket que contiene un mensaje
y su destino. El argumento del receive es un objeto DatagramPacket vaco en el
cual se pondra el mensaje, su longitud y su origen. Tanto el metodo send() como el
receive() pueden lanzar una IOException.
Las comunicaciones mediante datagramas de udp usan envos no bloqueantes (nonblocking sends) y recepciones bloqueantes (blocking receives). Las operaciones de
envo retornan cuando estas han dado el mensaje a los protocolos ip o udp subyacentes, los cuales son responsables de trasmitirlos a su destino. En la llegada, el
mensaje es puesto en una cola por el socket que esta asociado al puerto de destino.
El mensaje puede ser recogido de la cola por una excepcion o llamadas futuras de
recepcion (receive()) sobre ese socket. Los mensajes son descartados en el destino si ning
un proceso tiene asociado un socket al puerto de destino. El metodo
receptor (receive()) se bloquea hasta que se recibe un datagrama, a menos que
se establezca un tiempo lmite (timeout) sobre el socket. Si el proceso que invoca
al metodo receive() tiene otra tarea que hacer mientras espera por el mensaje,
debera planificarse en un flujo de ejecucion (thread ) separado.
setSoTimeout().
Este metodo permite establecer un tiempo de espera. Con un tiempo de espera
establecido, el metodo receive() se bloqueara por el tiempo especificado y entonces
lanzara una InterruptedIOException().

Herramientas y Lenguajes de Programacion 04-05

connect().
Este metodo se utiliza para conectar a un puerto remoto particular y una direccion
de Internet, en este caso el socket solo es capaz de enviar y recibir mensajes desde
esa direccion.

4.

Ejemplo

El siguiente ejemplo implementa un servidor de refranes.


El ejemplo consta de dos programas Java ejecutandose de forma independiente QuoteServer
y QuoteClient. Sin embargo, esta constituido por cinco ficheros:
QuoteServer.java (implementacion del Servidor)
QuoteServerThread.java (implementacion del thread Servidor)
QuoteClient.java (implementacion del cliente)
one-liners.txt (fichero de refranes)
MyInput.java (implementacion de entrada/salida)

5.

Ejercicio

1. Compile y ejecute el ejemplo del apartado anterior.


2. Implementar un servidor y un cliente de eco usando las clases DatagramPacket y
DatagramSocket (UDPServer.java y UDPClient.java).
Como es el comportamiento en cuanto al tiempo empleado si se compara con la
implementacion con las clases Socket y ServerSocket?

También podría gustarte