Comunicacion Cliente Servidor UDP

7

Click here to load reader

description

Comunicación Cliente-Servidor usando el protocolo UDP

Transcript of Comunicacion Cliente Servidor UDP

Page 1: Comunicacion Cliente Servidor UDP

REDES DE DATOSCOMUNICACIÓN CLIENTE/SERVIDOR CON PROTOCOLO UDP

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

UNIVERSIDAD SURCOLOMBIANAINGENIERÍA ELECTRÓNICA

NEIVA2012

Page 2: Comunicacion Cliente Servidor UDP

OBJETIVOS

Implementar la comunicación entre cliente y servidor utilizando el protocolo UDP(protocolo de datagramas de usuario).

Determinar las diferencias entre los protocolos UDP y TCP.

TEORÍA

CAPA DE TRANSPORTE: Es la capa encargada de transportar los mensajes de la capa deaplicación entre los puntos terminales de la aplicación. Se aplica tanto para el modelo OSIcomo para el modelo TCP/IP. Añade información para la entrega del mensaje a la aplicaciónapropiada y bits de detección de error.

PROTOCOLO: Son reglas que rigen la comunicación entre dos sistemas terminales que secomunican a través de la red.

UDP (User Datragram Protocol): Es un protocolo que provee la entrega de datos sin utilizarmuchos recursos, es decir, tiene una sobrecarga menor al momento de utilizar la red. Es unservicio no fiable, que no garantiza que los datos enviados por un proceso lleguen intactos alproceso de destino.

TCP (Transmission Control Protocol): Es un protocolo que incurre en el uso adicional derecursos para agregar funciones. Proporciona una transferencia de datos fiables utilizandotécnicas de control de flujo y de congestión.

Nota: Tanto el protocolo UDP como TCP son protocolos de la capa de transporte del modeloTCP/IP y su responsabilidad principal es ampliar el servicio de entrega de IP entre dos sistemasterminales a un servicio de entrega entre dos procesos que estén ejecutándose en los sistemasterminales.

PROCEDIMIENTO

A través del programa ECLIPSE JUNO que implementa el lenguaje de programación java,creamos un programa tanto para el servidor como para el cliente, para crear unacomunicación entre ellos usando el protocolo UDP.

A continuación se muestra el código desarrollado para el servidor seguido del código para elcliente.

Page 3: Comunicacion Cliente Servidor UDP

SERVIDOR UDP

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import 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 = newDatagramPacket(b,b.length);

DatagramSocket s= newDatagramSocket(321);

ServerSocket server = new ServerSocket(2525);System.out.println("Esperando conexión");

Socket socket = server.accept();System.out.println("Conexión establecida");

while(true){s.receive(p);String mensaje = newString(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 = newDatagramPacket(b,b.length,dire,puerto);s.send(p);if ("FIN".equals(mensaje)) {

break;}

System.out.println(mensaje);}

System.out.println("Conexión cerrada");

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

}}

Daremos una breve explicación a las líneas usadas en el código:

Page 4: Comunicacion Cliente Servidor UDP

import java.io.import java.net.

Estos comandos son usados para importar clases de un paquete, el .io es usado para paquetesde Entrada/Salida y el .net se usa en combinación con las clases de paquete .io para leer yescribir 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 código con elcual lo guardamos en el computador, dentro de la clase definimos el método main que tienelos atributos public y static además del void que nos indica que el método implementado noretorna ningún valor. La forma String[] args es la definición de los argumentos que recibe elmétodo main. En este caso se recibe un argumento. Los paréntesis [] indican que elargumentos es un arreglo y la palabra String es el tipo de los elementos del arreglo.

System.out.println("…");

Esta instrucción 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 tamaño de 1Kb o más.

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

Try-Catch es una instrucción básica que se utiliza fundamentalmente para el manejo de erroresy excepciones. En las llaves de try se escribe el código que es susceptible a cualquier tipo deerror, dentro del catch definimos las excepciones que se pueden dar.

DatagramPacket p = newDatagramPacket(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= newDatagramSocket(321);

Creamos un nuevo socket y lo enlazamos a cualquier puerto que haya libre, cabe resaltar queel puerto usado tiene que ser igual en el código cliente.

ServerSocket server = new ServerSocket(2525);Socket socket = server.accept();

Creamos un socket con un puerto específico para poder establecer la conexión entre loscódigos.

Page 5: Comunicacion Cliente Servidor UDP

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

Implementamos una pequeña lógica lo cual nos permite recibir paquetes del cliente hasta queel mensaje que nos envié el cliente sea FIN, en ese momento el servidor será cerrado.

s.receive(p);

El método receive por defecto bloquea el programa hasta que llegan los datos a s.

String mensaje = newString(b,0,p.getLength());

Creamos un array nulo (mensaje) y un array con una longitud específica.

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

Estas líneas corresponden al uso del DatagramPacket del código, el cual en InetAddress nosdevuelve en la variable dire la dirección almacenada en el paquete y en int nos devuelve elpuerto, 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 específico o la dirección especificada)construimos nuestro mensaje de salida que nos dará el nombre del cliente, el puerto que seuso 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 tamaño máximo, la dirección delcliente y el puerto por el que atiende peticiones. El método send envía en s el paquete pdefinido en la línea anterior.

Page 6: Comunicacion Cliente Servidor UDP

CLIENTE UDP

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

public class EmisorUDP {public static void main(String[] args){

System.out.println("Iniciando Cliente");

System.out.println("Iniciando conexión con Servidor");

Socket socket = new Socket("IPdelServidor",2525);

System.out.println("Conexión 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=newDatagramPacket(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("Conexión perdida con el servidor");

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

}}Describiremos las líneas que son diferentes a las usadas en el código servidor:

Page 7: Comunicacion Cliente Servidor UDP

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

Creamos un objeto de flujo teclado que se inicializa con System.in, que asocia el flujo a laentrada estándar. El comando permite al código leer texto introducido a través del teclado.

String msg = teclado.readLine();

El array msg almacena caracteres hasta que el usuario termina la línea 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, ladirección del servidor y el puerto común por los dos códigos.

CONCLUSIONES

El protocolo UDP no brinda tanta confiabilidad como el protocolo TCP, pero a su vezTCP requiere muchos más recursos que UDP.

El programa ECLIPSE JUNO con programación JAVA, permite desarrollar lacomunicación entre cliente/servidor tanto con protocolo UDP como TCP.

Los códigos cliente y servidor tienen un gran número de líneas en común lo que hacefácil el entendimiento de éstos.

El uso de ciclos y de instrucciones de manejo de errores nos ayuda a darle una buenavisualización a los códigos.