Sei sulla pagina 1di 7

REDES DE DATOS COMUNICACIN CLIENTE/SERVIDOR CON PROTOCOLO UDP

GERMAN ALEJANDRO MORA GOMEZ COD. 2008275357 RAFAEL MATEUS CUELLAR COD. 2007268318

UNIVERSIDAD SURCOLOMBIANA INGENIERA ELECTRNICA NEIVA 2012

OBJETIVOS Implementar la comunicacin entre cliente y servidor utilizando el protocolo UDP (protocolo de datagramas de usuario). Determinar las diferencias entre los protocolos UDP y TCP.

TEORA CAPA DE TRANSPORTE: Es la capa encargada de transportar los mensajes de la capa de aplicacin entre los puntos terminales de la aplicacin. Se aplica tanto para el modelo OSI como para el modelo TCP/IP. Aade informacin para la entrega del mensaje a la aplicacin apropiada y bits de deteccin de error. PROTOCOLO: Son reglas que rigen la comunicacin entre dos sistemas terminales que se comunican a travs de la red. UDP (User Datragram Protocol): Es un protocolo que provee la entrega de datos sin utilizar muchos recursos, es decir, tiene una sobrecarga menor al momento de utilizar la red. Es un servicio no fiable, que no garantiza que los datos enviados por un proceso lleguen intactos al proceso de destino. TCP (Transmission Control Protocol): Es un protocolo que incurre en el uso adicional de recursos para agregar funciones. Proporciona una transferencia de datos fiables utilizando tcnicas de control de flujo y de congestin. Nota: Tanto el protocolo UDP como TCP son protocolos de la capa de transporte del modelo TCP/IP y su responsabilidad principal es ampliar el servicio de entrega de IP entre dos sistemas terminales a un servicio de entrega entre dos procesos que estn ejecutndose en los sistemas terminales.

PROCEDIMIENTO A travs del programa ECLIPSE JUNO que implementa el lenguaje de programacin java, creamos un programa tanto para el servidor como para el cliente, para crear una comunicacin entre ellos usando el protocolo UDP. A continuacin se muestra el cdigo desarrollado para el servidor seguido del cdigo para el cliente.

SERVIDOR UDP import import import import import import java.io.IOException; java.net.DatagramPacket; java.net.DatagramSocket; java.net.InetAddress; java.net.SocketException; java.net.UnknownHostException;

public class ReceptorUDP { public static void main(String[] args){ System.out.println("Iniciando Servidor"); byte[] b = new byte[1024]; try{ DatagramPacket p = new DatagramPacket(b,b.length); DatagramSocket s= new DatagramSocket(321); ServerSocket server = new ServerSocket(2525); System.out.println("Esperando conexin"); Socket socket = server.accept(); System.out.println("Conexin establecida"); while(true){ s.receive(p); String mensaje = new String(b,0,p.getLength()); InetAddress dire= p.getAddress(); int puerto = p.getPort(); System.out.println("Recibido desde: " + dire.getHostName()+" puerto= "+ +puerto+" Mensaje= "+mensaje); b = mensaje.getBytes(); p = new DatagramPacket(b,b.length,dire,puerto); s.send(p); if ("FIN".equals(mensaje)) { break; } } System.out.println(mensaje);

System.out.println("Conexin cerrada"); } catch(SocketException e){} catch(UnknownHostException e){} catch(IOException e){} } }

Daremos una breve explicacin a las lneas usadas en el cdigo:

import java.io. import java.net.

Estos comandos son usados para importar clases de un paquete, el .io es usado para paquetes de Entrada/Salida y el .net se usa en combinacin con las clases de paquete .io para leer y escribir datos en al red
public class ReceptorUDP { public static void main(String[] args){

En public class definimos una clase llamada ReceptorUDP que es el nombre del cdigo con el cual lo guardamos en el computador, dentro de la clase definimos el mtodo main que tiene los atributos public y static adems del void que nos indica que el mtodo implementado no retorna ningn valor. La forma String[] args es la definicin de los argumentos que recibe el mtodo main. En este caso se recibe un argumento. Los parntesis [] indican que el argumentos es un arreglo y la palabra String es el tipo de los elementos del arreglo.
System.out.println("");

Esta instruccin muestra un string en la ventana de consola del programa eclipse.


byte[] b = new byte[1024];

El array de bytes b almacenar los datos enviados por el cliente que en este caso no podr almacenar datos de un tamao de 1Kb o ms.
try{} catch(SocketException e){} catch(UnknownHostException e){} catch(IOException e){}

Try-Catch es una instruccin bsica que se utiliza fundamentalmente para el manejo de errores y excepciones. En las llaves de try se escribe el cdigo que es susceptible a cualquier tipo de error, dentro del catch definimos las excepciones que se pueden dar.
DatagramPacket p = new DatagramPacket(b,b.length);

El programa servidor crea un socket UDP en el que recibir los paquetes de datos (datagramas) con un buffer determinado y de una longitud definida.
DatagramSocket s= new DatagramSocket(321);

Creamos un nuevo socket y lo enlazamos a cualquier puerto que haya libre, cabe resaltar que el puerto usado tiene que ser igual en el cdigo cliente.
ServerSocket server = new ServerSocket(2525); Socket socket = server.accept();

Creamos un socket con un puerto especfico para poder establecer la conexin entre los cdigos.

while (true) {} if ("FIN".equals(mensaje)) {break;}

Implementamos una pequea lgica lo cual nos permite recibir paquetes del cliente hasta que el mensaje que nos envi el cliente sea FIN, en ese momento el servidor ser cerrado.
s.receive(p);

El mtodo receive por defecto bloquea el programa hasta que llegan los datos a s.
String mensaje = new String(b,0,p.getLength());

Creamos un array nulo (mensaje) y un array con una longitud especfica.


InetAddress dire= p.getAddress(); int puerto = p.getPort();

Estas lneas corresponden al uso del DatagramPacket del cdigo, el cual en InetAddress nos devuelve en la variable dire la direccin almacenada en el paquete y en int nos devuelve el puerto, entero, almacenado en el paquete en la variable puerto.
System.out.println("Recibido desde: " + dire.getHostName()+" puerto= "+ +puerto+" Mensaje= "+mensaje);

Una vez obtenida el puerto y la IP (ya sea el nombre especfico o la direccin especificada) construimos nuestro mensaje de salida que nos dar el nombre del cliente, el puerto que se uso y el mensaje que se envi.
b = mensaje.getBytes();

Convertimos el array mensaje en una cadena de bytes.


DatagramPacket(b,b.length,dire,puerto); s.send(p);

Creamos el paquete de datos que vamos a enviar con un tamao mximo, la direccin del cliente y el puerto por el que atiende peticiones. El mtodo send enva en s el paquete p definido en la lnea anterior.

CLIENTE UDP
import import import import import import import import import java.io.BufferedReader; java.io.IOException; java.io.InputStreamReader; java.net.DatagramPacket; java.net.DatagramSocket; java.net.InetAddress; java.net.Socket; java.net.SocketException; java.net.UnknownHostException;

public class EmisorUDP { public static void main(String[] args){ System.out.println("Iniciando Cliente"); System.out.println("Iniciando conexin con Servidor"); Socket socket = new Socket("IPdelServidor",2525); System.out.println("Conexin establecida"); try{ BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("Introduzca el texto a enviar"); String msg = teclado.readLine(); byte[] b = msg.getBytes(); DatagramPacket p = new DatagramPacket(b,b.length,InetAddress.getByName("IPdelServidor"),321); DatagramSocket s= new DatagramSocket(); System.out.println("Mensaje enviado a: " + p.getAddress().getHostName()+" puerto= " +p.getPort()); s.send(p); p=new DatagramPacket(b,b.length); s.receive(p); msg = new String(b,0,b.length); System.out.println("Respuesta desde: " + p.getAddress().getHostName()+" Mensaje: " +msg); s.close(); if ("FIN".equals(msg)) { break; } } System.out.println("Conexin perdida con el servidor");

} catch(SocketException e){} catch(UnknownHostException e){} catch(IOException e){}

Describiremos las lneas que son diferentes a las usadas en el cdigo servidor:

BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));

Creamos un objeto de flujo teclado que se inicializa con System.in, que asocia el flujo a la entrada estndar. El comando permite al cdigo leer texto introducido a travs del teclado.
String msg = teclado.readLine();

El array msg almacena caracteres hasta que el usuario termina la lnea con un enter.
DatagramPacket(b,b.length,InetAddress.getByName("IPdelServidor"),321);

Creamos el paquete de datos que vamos a enviar con el array que almacena los datos, la direccin del servidor y el puerto comn por los dos cdigos.

CONCLUSIONES El protocolo UDP no brinda tanta confiabilidad como el protocolo TCP, pero a su vez TCP requiere muchos ms recursos que UDP. El programa ECLIPSE JUNO con programacin JAVA, permite desarrollar la comunicacin entre cliente/servidor tanto con protocolo UDP como TCP. Los cdigos cliente y servidor tienen un gran nmero de lneas en comn lo que hace fcil el entendimiento de stos. El uso de ciclos y de instrucciones de manejo de errores nos ayuda a darle una buena visualizacin a los cdigos.