100%(2)100% encontró este documento útil (2 votos)
360 vistas
Sockets TCP y UDP en Java
Este documento describe el uso de sockets TCP y UDP en Java para la comunicación entre procesos. Los sockets permiten que programas establezcan conexiones y se comuniquen a través de redes como Internet. Un socket TCP se utiliza para crear un programa cliente-servidor que permite el intercambio de mensajes entre ellos, mientras que los sockets UDP se usan para que un cliente envíe datos aleatorios periódicamente a un servidor.
Descarga como PDF, TXT o lee en línea desde Scribd
100%(2)100% encontró este documento útil (2 votos)
360 vistas
Sockets TCP y UDP en Java
Este documento describe el uso de sockets TCP y UDP en Java para la comunicación entre procesos. Los sockets permiten que programas establezcan conexiones y se comuniquen a través de redes como Internet. Un socket TCP se utiliza para crear un programa cliente-servidor que permite el intercambio de mensajes entre ellos, mientras que los sockets UDP se usan para que un cliente envíe datos aleatorios periódicamente a un servidor.
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 32
Sockets TCP y UDP en J ava
Ms. Ing. J airo E. Mrquez D.
Objetivo: Utilizar sockets TCP y UDP para el intercambio de mensajes mediante el uso de sockets en Java. Debido a la lentitud de las lneas de comunicaciones (sobre todo en internet), el intercambio de mensajes es recomendable que sea mnimo de tal forma que se obtenga el mximo rendimiento de nuestro programa, no debemos depender demasiado de dichas comunicaciones. Introduccin Los sockets fueron popularizados por Berckley Software Distribution, de la universidad norteamericana de Berkley. En esencia son formas en las que se puede interconectar dos (o ms) programas mediante el uso de internet. En java se utilizan para poder crear conexiones utilizando una IP/hostname y un puerto para establecer la conexin. Para aprender podemos utilizarla para conectar 2 programas por medio de Internet. Sokets Los sockets constan de dos programas, un cliente y servidor. El programa servidor comienza a escuchar en un puerto determinado (nosotros lo especificamos), y posteriormente el programa que hace de cliente debe conocer la IP o nombre de dominio/hostname del servidor y el puerto que est escuchando, al saber esto simplemente solicita establecer una conexin con el servidor. Es aqu cuando el servidor acepta esa conexin y se puede decir que estos programas estn conectados, de este modo pueden intercambiar informacin. Con base en lo anterior, se puede inferir que los sockets permiten la comunicacin entre procesos de diferentes mquinas de una red. Es decir, un socket es un punto de comunicacin por el cual un proceso puede emitir o recibir informacin. Los sockets han de ser capaces de utilizar el protocolo de streams TCP (Transfer Contro Protocol) y el de datagramas UDP (User Datagram Protocol). Utilizan una serie de primitivas para establecer el punto de comunicacin, para conectarse a una mquina remota en un determinado puerto que est disponible, para escuchar en l, para leer o escribir y publicar informacin en l, y finalmente para desconectarse. Con todas primitivas se puede crear un sistema de dilogo muy completo. Tomado de http://zarza.usal.es/~fgarcia/doc/tuto2/V_2.htm Nota: Ambos programas (servidor y cliente) no necesitan estar programados en Java, se puede programar en otros lenguajes, incluso programar un servidor en java y utilizar un cliente ya existente que pueda conectarse a un puerto especificado. El cliente debe de conocer tanto el puerto a utilizar como la IP o dominio del servidor, mientras el servidor solo debe conocer el puerto de conexin. Ejemplos Java proporciona la clase InetAddress para administrar las direcciones IP y los dominios, algunos mtodos que se puede encontrar son los siguientes: byte[] getAddress(); devuelve la direccin IP de un objeto InetAddress. InetAddress getByName(String host); devuelve un objeto InetAddress. static InetAddressgetByAddress(byte[] direccion) ; introducimos una direccin IP y nos devuelve un objeto con esa direccin. static InetAddressgetByAddress(String host, byte[] addr) ; igual que el anterior pero tambin guarda el host. InetAdress getLocalHost() ; devuelve un objeto con la direccin IP local del equipo A continuacin se tiene un ejemplo de todos estos mtodos: 1 package InetAddress; import java.net.InetAddress; import java.net.UnknownHostException; public class DireccionesIP { public static void main(String[] args) { byte[] direccionLocal = {127, 0, 0, 1}; //Direccin IP del Localhost InetAddress equipo; try { // Mtodos estticos de InetAddress para obtener el objeto equipo equipo = InetAddress.getLocalHost(); // Creamos el objeto equipo de la clase InetAddress System.out.println("Mi equipo es: "+equipo); 1 Fuente de consulta. http://www.redeszone.net/2012/10/15/curso-java-volumen-xi-todo-sobre-sockets- tcp-y-udp-en-java/ System.out.println("Su direccin IP es: "+equipo.getHostAddress()); System.out.println("Su nombre es: "+equipo.getHostName()); System.out.println("Y su nombre cannico: "+equipo.getCanonicalHostName()); System.out.println(); // Se obtiene el equipo a partir del nombre equipo = InetAddress.getByName("www.google.com"); System.out.println("el equipo www.google.com es: "+equipo); System.out.println("Su direccin IP es: "+equipo.getHostAddress()); System.out.println("Su nombre es: "+equipo.getHostName()); System.out.println("Y su nombre cannico: "+equipo.getCanonicalHostName()); System.out.println(); // Obtenemos el equipo a partir de su direccin IP equipo = InetAddress.getByAddress(direccionLocal); System.out.println("Mi equipo es: "+equipo); System.out.println("Su direccin IP es: "+equipo.getHostAddress()); System.out.println(); // Obtenemos todas las direcciones IP de un equipo InetAddress[] identidades; equipo = InetAddress.getLocalHost(); identidades = InetAddress.getAllByName(equipo.getHostName()); for (int i=0; i<identidades.length; i++) System.out.println("Id"+i+": "+identidades[i]); System.out.println(); } catch (UnknownHostException e) { System.out.println("Error de conexin"); System.out.println(e.toString()); } } } La salida del programa anterior es: Equipo es: -/10.10.2.11 Su direccin IP es: 10.10.2.11 Su nombre es: - Y su nombre cannico: - el equipo www.google.com es: www.google.com/173.194.34.240 Su direccin IP es: 173.194.34.240 Su nombre es: www.google.com Y su nombre cannico: mad01s09-in-f16.1e100.net Mi equipo es: /127.0.0.1 Su direccin IP es: 127.0.0.1 Id0: -/10.10.2.11 Id1: -/192.168.213.1 Id2: -/192.168.182.1 Id3: -/**%10 Id4: -/**%17 Id5: -/**%18 Ahora se va a desarrollar un cliente-servidor TCP para el intercambio de mensajes. Servidor TCP package Sockets; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Servidor { public static void main(String args[]) { ServerSocket servidor; Socket conexion; DataOutputStream salida; DataInputStream entrada; int num = 0; try { servidor = new ServerSocket(5000); // Creamos un ServerSocket en el puerto especificado System.out.println("Servidor Arrancado correctamente"); while (true) { conexion = servidor.accept(); // Esperamos una conexin num++; System.out.println("Conexin nmero" + num + " desde: " + conexion.getInetAddress().getHostName()); entrada = new DataInputStream(conexion.getInputStream()); // Abrimos los canales de entrada y salida salida = new DataOutputStream(conexion.getOutputStream()); String mensaje = entrada.readUTF(); //Leemos el mensaje del cliente System.out.println("Conexin n." + num + " mensaje: " + mensaje); salida.writeUTF("Sois los mejores " + mensaje); // Le respondemos conexion.close(); // Y cerramos la conexin } } catch (IOException e) { } } } Cliente TCP package Sockets; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; public class Cliente { public static void main(String args[]) { Socket cliente; DataInputStream entrada; DataOutputStream salida; String mensaje, respuesta; try { cliente = new Socket(InetAddress.getLocalHost(), 5000); // se crea el socket para conectarnos al puerto 5000 del servidor entrada = new DataInputStream(cliente.getInputStream()); //Creamos los canales de entrada/salida salida = new DataOutputStream(cliente.getOutputStream()); mensaje = "RedesZone"; salida.writeUTF(mensaje); // Enviamos un mensaje al servidor respuesta = entrada.readUTF(); // Leemos la respuesta System.out.println("Mi mensaje: " + mensaje); System.out.println("Respuesta del Servidor: " + respuesta); cliente.close(); // Cerramos la conexion } catch (IOException e) { System.out.println("Error: " + e.getMessage()); } } } Ahora se va ver cmo realizar un programa cliente-servidor con UDP. El programa cliente genera un nmero aleatorio cada 100ms y lo convierte en una cadena dada y lo enva por el socket UDP para imprimir la cadena que ha enviado (no el nmero de envo) y comprobaremos si se ha recibido en orden. Servidor UDP: package ProgramaJavaCompleto; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import java.util.logging.Level; import java.util.logging.Logger; public class ServidorUDP { public static void main(String[] args) throws SocketException { DatagramSocket socket = new DatagramSocket(5001); //Creamos el socket UDP System.out.println("Servidor iniciado correctamente"); int i = 0; while (true) { try { byte[] buf = new byte[128]; DatagramPacket paquete = new DatagramPacket(buf, buf.length); //Formamos el datagrama para empezar a recibir datos socket.receive(paquete); //Orden para recibir paquetes String cadena = new String(paquete.getData()); i++; System.out.println("Recibido de cliente: " + cadena); String trozo [] = cadena.split(":"); String trozoBueno [] = trozo[0].split("<"); int comprobar = Integer.parseInt(trozoBueno[1]); if (i == comprobar) { System.out.println("Correcto"); } else { System.out.println("Ha habido un error"); } } catch (IOException ex) { Logger.getLogger(ClienteUDP.class.getName()).log(Level.SEVERE, null, ex); } } } } Cliente UDP: package ProgramaJavaCompleto; import java.io.IOException; import java.net.*; public class ClienteUDP { public static void main(String[] args) throws SocketException, UnknownHostException, IOException, InterruptedException { DatagramSocket socket = new DatagramSocket(); //Creamos el socket UDP. int i = 0; while (true) { i++; Thread.sleep(100); if (i < 10) { int aleatorio = (int) (Math.random() * 1000); String cadena = "<00" + i + ":" + aleatorio + ">"; DatagramPacket paquete = new DatagramPacket(cadena.getBytes(), cadena.length(), InetAddress.getLocalHost(), 5001); //Creamos el datagrama y lo enviamos con los datos sealados (argumentos) socket.send(paquete); } else if (i >= 10 && i < 100) { int aleatorio = (int) (Math.random() * 1000); String cadena = "<0" + i + ":" + aleatorio + ">"; DatagramPacket paquete = new DatagramPacket(cadena.getBytes(), cadena.length(), InetAddress.getLocalHost(), 5001); socket.send(paquete); } else if (i >= 100) { int aleatorio = (int) (Math.random() * 1000); String cadena = "<" + i + ":" + aleatorio + ">"; DatagramPacket paquete = new DatagramPacket(cadena.getBytes(), cadena.length(), InetAddress.getLocalHost(), 5001); socket.send(paquete); } } } } Prctica Cliente y Servidor UDP en Java El funcionamiento es el siguiente: - En el cliente se pondr una palabra, el servidor la leer y la transformar en maysculas, a continuacin el servidor se la manda al cliente junto con la IP y el puerto usado por el cliente. - Se puede elegir los puertos a usar con el comando p, si no ponemos puerto, se pondr por defecto el 2510. Se tratan excepciones y control de errores, si se activan el cliente antes de abrir el servidor no saldr como en TCP ya que UDP es no conectivo y no fiable, no orientado a conexin. El cdigo puede mejorarse, pero en esencia establece el proceso cliente / servidor FTPo un cliente de email. Modo de ejecucin (GNU/Linux) del SERVIDOR: Compilar: javac UDPServidor.java Ejecutar: java UDPServidor
java TCPServidor p <puerto>
import java.io.*; import java.net.*; class UDPServidor { public static void main(String args[]) throws Exception { System.out.println("El servidor va a ponerse a la escucha, un momento mientras se leen los parametros"); int port = 2510; if (args.length == 0 || args==null) { System.out.println("El puerto no se ha especificado, se usara el puerto por defecto: 2510"); } else if (args[0].equals("p")) { port = Integer.parseInt(args[1]); System.out.println("Vamos a usar el puerto:"+port); } else { System.out.println("Debes especificar la opcion p"); } DatagramSocket socketServidor = null; try { socketServidor = new DatagramSocket(port); } catch (IOException e) { System.out.println("Error al crear el objeto socket servidor"); System.exit ( 0 ); } byte [] recibirDatos = new byte[1024]; byte [] enviarDatos = new byte[1024]; byte [] enviarDatos2 = new byte[1024]; while(true) { DatagramPacket recibirPaquete = new DatagramPacket(recibirDatos, recibirDatos.length); try { socketServidor.receive(recibirPaquete); } catch (IOException e) { System.out.println("Error al recibir"); System.exit ( 0 ); } String frase = new String(recibirPaquete.getData()); InetAddress DireccionIP = recibirPaquete.getAddress(); int puerto = recibirPaquete.getPort(); String fraseMayusculas = frase.toUpperCase(); enviarDatos = fraseMayusculas.getBytes(); DatagramPacket enviarPaquete = new DatagramPacket(enviarDatos, enviarDatos.length, DireccionIP, puerto); try { socketServidor.send(enviarPaquete); } catch (IOException e) { System.out.println("Error al recibir"); System.exit ( 0 ); } } } } Ahora con el cliente: Compilar: javac UDPCliente.java Ejecutar: java UDPCliente.java d <DIRECCION IP> m <MENSAJE> p <PUERTO (OPCIONAL)> import java.io.*; import java.net.*; class UDPCliente { public static void main(String args[]) throws Exception { System.out.println("El cliente se pone en marcha, un momento mientras se leen los parametros"); int port = 2510; String dire = null; String frase = null; if (args.length == 0 || args == null) { System.out.println("La direccin IP es obligatoria, el programa terminara"); System.exit(0); } else if (args.length < 4) { // ERROR SIEMPRE: EL NUMERO DE ARGUMENTOS OBLIGATORIOS ES 4 System.out.println("El nmero de argumentos es errneo, mnimo direccin y palabra: d direccin m palabra"); System.exit(0); } else if (args.length > 4) { if (args[4].equals("p")) { if (args.length < 6) { System.out.println("No se ha especificado puerto con opcion p; el programa terminara"); System.exit(0); } else { port = Integer.parseInt(args[5]); } System.out.println("Vamos a usar el puerto:" + port); } } if (args[0].equals("d")) { dire = (args[1]); System.out.println("Vamos a usar la direccion IP:" + dire); } else { // si no colocan d, que es obligatorio, fallara System.out.println("El parametro debe ser d, el programa terminara"); System.exit(0); } if (args[2].equals("m")) { frase = args[3]; } else {// si no colocan m, que es obligatorio, fallara System.out.println("El parametro debe ser m, el programa terminara"); System.exit(0); } BufferedReader entradaDesdeUsuario = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket socketCliente = null; try { socketCliente = new DatagramSocket(); } catch (IOException e) { System.out.println("Error al crear el objeto socket cliente"); System.exit ( 0 ); } InetAddress DireccionIP = null; try { DireccionIP = InetAddress.getByName(dire); } catch (IOException e) { System.out.println("Error al recuperar la IP del proceso"); System.exit ( 0 ); } byte [] enviarDatos = new byte[1024]; byte [] recibirDatos = new byte[1024]; enviarDatos = frase.getBytes(); DatagramPacket enviarPaquete = new DatagramPacket(enviarDatos, enviarDatos.length, DireccionIP, port); socketCliente.send(enviarPaquete); DatagramPacket recibirPaquete = new DatagramPacket(recibirDatos, recibirDatos.length); socketCliente.receive(recibirPaquete); String fraseModificada = new String(recibirPaquete.getData()); InetAddress direccion = (recibirPaquete.getAddress()); int puertoUsado = (recibirPaquete.getPort()); System.out.println("DEL SERVIDOR: " + fraseModificada); System.out.println("La direccion IP es:"+ direccion); System.out.println("El puerto es:"+ puertoUsado); socketCliente.close(); } } Otro cdigo muy parecido a los anteriores, escucha por el puerto 5000, cuando un cliente se conecta este enva un mensaje de confirmacin al cliente, luego el cliente al enviar su primer mensaje, el servidor enva un segundo mensaje y se cierra la conexin. Tambin el de un cliente, se puede observar cmo se pide la conexin al servidor, el cliente nicamente enva un mensaje de texto pero no recibe informacin. 2 Cdigo fuente del servidor import java.net.*; import java.io.*; public class Conex { final int PUERTO=5000; ServerSocket sc; Socket so; DataOutputStream salida; String mensajeRecibido; //SERVIDOR 2 Tomado de http://codigoprogramacion.com/cursos/java/103-sockets-en-java-con-cliente-y- servidor.html#.UlHkCNKmHLk public void initServer() { BufferedReader entrada; try { sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/ so=new Socket(); System.out.println("Esperando una conexin:"); so = sc.accept(); //Inicia el socket, ahora est esperando una conexin por parte del cliente System.out.println("Un cliente se ha conectado."); //Canales de entrada y salida de datos entrada = new BufferedReader(new InputStreamReader(so.getInputStream())); salida = new DataOutputStream(so.getOutputStream()); System.out.println("Confirmando conexion al cliente...."); salida.writeUTF("Conexin exitosa...n envia un mensaje <img src="http://codigoprogramacion.com/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley"> "); //Recepcion de mensaje mensajeRecibido = entrada.readLine(); System.out.println(mensajeRecibido); salida.writeUTF("Se recibio tu mensaje.n Terminando conexin..."); salida.writeUTF("Gracias por conectarte, adios!"); System.out.println("Cerrando conexin..."); sc.close();//Aqui se cierra la conexin con el cliente }catch(Exception e ) { System.out.println("Error: "+e.getMessage()); } } } Cdigo fuente cliente simple import java.net.*; import java.io.*; public class Conex { final String HOST = "localhost"; final int PUERTO=5000; Socket sc; DataOutputStream mensaje; DataInputStream entrada; //Cliente public void initClient() /*ejecuta este metodo para correr el cliente */ { try { sc = new Socket( HOST , PUERTO ); /*conectar a un servidor en localhost con puerto 5000*/ //creamos el flujo de datos por el que se enviara un mensaje mensaje = new DataOutputStream(sc.getOutputStream()); //enviamos el mensaje mensaje.writeUTF("hola que tal!!"); //cerramos la conexin sc.close(); }catch(Exception e ) { System.out.println("Error: "+e.getMessage()); } } } Otra opcin a probar es la siguiente: Servidor TCP. Cdigo JAVA La aplicacin servidor TCP depende de una clase de comunicaciones proporcionada por Java: ServerSocket. Esta clase realiza la mayor parte del trabajo de crear un servidor. El servidor implementado escucha por el puerto de comunicaciones 8001, y acepta rdenes del tipo HELP, DATE, QUIT y NAME. import java.util.*; import java.io.*; import java.net.*; public class ServerTest { final static int SERVER_PORT = 8001; // puerto de escucha de nuestro servidor public static void main (String args[]) { Server server; String clientRequest; BufferedReader reader; PrintWriter writer; // se crea el servidor y los canales de entrada y salida server = new Server (SERVER_PORT); reader = new BufferedReader (new InputStreamReader (server.in)); writer = new PrintWriter (new OutputStreamWriter (server.out), true); // En cuanto se establece una conexin por parte del cliente, se enva un saludo writer.println ("Bienvenido al Servidor: " + new Date() + "/n"); while (true) { try { // se lee el canal de entrada la peticin del cliente clientRequest = reader.readLine(); // sale por pantalla la peticin del cliente System.out.println ("Recibido :" + clientRequest); // El protocolo de nuestro servidor solo acepta ordenes : HELP, QUIT,NAME,DATE if (clientRequest.startsWith ("HELP")) { writer.println ("rdenes: HELP QUIT NAME DATE"); } else { if (clientRequest.startsWith ("QUIT")) { System.exit(0); } else { if (clientRequest.startsWith("NAME")) {InetAddress host; host=InetAddress.getLocalHost(); writer.println("Nombre del host :"+ host.getHostName());} else if (clientRequest.startsWith("DATE")) (writer.println("Fecha del sistema :"+ new Date())); else { writer.println ("ERROR: Comando :'" + clientRequest +"' no reconocido, use HELP"); } } } } catch (IOException e) { System.out.println ("Excepcin en el servidor " + e); System.exit(0); } } } } //------------------------------------------------------------------- // Esta clase es la que implementa el socket del servidor (ServerSocket) class Server { private ServerSocket server; private Socket socket; public InputStream in; public OutputStream out; public Server (int port) { try { server = new ServerSocket (port); System.out.println ("Servidor Java Activo! \n"); System.out.println(""+server+"\n"); // Espera suspendido hasta que un cliente establece una conexin socket = server.accept(); in = socket.getInputStream(); out = socket.getOutputStream(); } catch (IOException e) { System.out.println ("Excepcin en el constructor server: " + e); } } } NOTA: Para poder ejecutar el servidor, siga las siguientes instrucciones: Guardar el programa con el nombre:ServerTest.java. Instale el jdk 1.3 o superior de Sun. Compile el fichero mediante la utilidad javac, para ello escriba la siguiente orden en la lnea de comandos : javac ServerTest.java Por ltimo, lance la ejecucin del servidor mediante la orden: java ServerTest Puede comprobar el funcionamiento del servidor mediante el uso de un programa cliente, o bien, mediante el uso de telnet. Para ello, ejecute telnet con la direccin IP donde este ejecutndose el servidor, si est en el mismo ordenador, la IP es 127.0.0.1 y el puerto de comunicaciones es el 8001. Cliente TCP. Cdigo JAVA El lado cliente de una aplicacin TCP/IP descansa en la clase Socket. De nuevo, mucho del trabajo necesario para establecer la conexin lo ha realizado la clase Socket. import java.io.*; import java.net.*; public class ClientTest { public static void pausa(){ try { Thread.sleep(3000); } catch (Exception ignored) {} } public static void main (String args[]) { String welcome, response; Client client; BufferedReader reader; PrintWriter writer; client = new Client (args[0], 8001); //la clase Client Implementa el socket cliente al que se le pasa el argumento 0 que contendr la direccin o nombre del servidor try { //creamos los canales de entrada/salida para comunicarnos con el servidor reader = new BufferedReader (new InputStreamReader (client.in)); writer = new PrintWriter (new OutputStreamWriter (client.out), true); //leemos la bienvenida que nos da el servidor welcome = reader.readLine(); pausa(); System.out.println ("Mensaje procedente del servidor: '"+ welcome +"'"); //para ver el funcionamiento, enviamos los comandos System.out.println ("Enviando comando NAME"); writer.println("NAME"); response = reader.readLine(); System.out.println ("Respuesta del servidor: '"+ response +"'"); //pausa pausa(); System.out.println ("Enviando comando HELP"); writer.println ("HELP"); response = reader.readLine(); System.out.println ("Respuesta del servidor: '"+ response +"'"); pausa(); System.out.println ("Enviando comando DATE"); writer.println("DATE"); response = reader.readLine(); System.out.println ("Respuesta del servidor: '"+ response +"'"); pausa(); //el siguiente comando no es entendido por el protocolo implementado por el servidor//como vemos en la respuesta que nos devuelve System.out.println ("Enviando comando xl"); writer.println("xl"); response = reader.readLine(); System.out.println ("Respuesta del servidor: '"+ response +"'"); pausa(); System.out.println ("Enviando comando QUIT"); writer.println("QUIT"); } catch (IOException e) { System.out.println ("IOException en client.in.readln()"); System.out.println(e); } try { Thread.sleep(2000); } catch (Exception ignored) {} } } //------------------------------------------------------------------- class Client { // establece los canales de entrada y de salida a disposicion de las clases de usuario public InputStream in; public OutputStream out; // El socket cliente private Socket client; public Client (String host, int port) { try { client = new Socket (host, port); System.out.println ("Datos del socket: " + client); in = client.getInputStream(); out= client.getOutputStream(); } catch (IOException e) { System.out.println("IOExc : " + e); } } } NOTA. Dilogo entre el cliente y el servidor. En la ejecucin del cliente, deber pasarle como parmetro el nombre o direccin del servidor. Ejemplo: Java Clientest localhost En este ejemplo, el cliente establecer la comunicacin en el puerto 8001 y en el ordenador local, ya que como parmetro se le ha pasado localhost. Servidor UDP. Cdigo JAVA La aplicacin servidor UDP depende de una clase de comunicaciones proporcionada por Java: DatagramSocket Esta clase realiza la mayor parte del trabajo de crear el socket. El servidor implementado escucha por el puerto de comunicaciones 8050, cuando le llega un datagrama procedente de algn cliente, imprime la direccin del cliente, y el puerto por la salida estndar del sistema, y luego enva un datagrama que contiene la fecha del sistema. import java.net.*; import java.io.*; import java.util.*; public class ServerTime{ public static void main(String[] args) throws IOException { //el puerto de escucha del servidor ser el 8050 int PUERTO=8050; byte msg[]=new byte[1024]; //se crea el socket UDP del servidor en el puerto asociado DatagramSocket s = new DatagramSocket(PUERTO); System.out.println("Servidor Activo"); //implementacin del protocolo del servidor en un bucle infinito while (true) { DatagramPacket recibido = new DatagramPacket(new byte [1024],1024); //llega un datagrama s.receive(recibido); System.out.println("Ha llegado una peticion \n"); System.out.println("Procedente de :" + recibido.getAddress()); System.out.println("En el puerto :" + recibido.getPort()); System.out.println("Sirviendo la peticin"); //se prepara el mensaje a enviar con la fecha del sistema String message=new String("HORA DEL SERVIDOR " + new Date()); msg=message.getBytes(); //se crea el datagrama que contendr al mensaje DatagramPacket paquete=new DatagramPacket(msg,msg.length,recibido.getAddress(), recibido.getPort()); //se le envia al cliente s.send(paquete); } } } NOTA: Para ejecutar el servidor, siga las siguientes instrucciones: Guarde el programa con el nombre: ServerTime.java Instale el jdk 1.3 o superior de Sun. Compile el fichero mediante la utilidad javac, para ello escriba la siguiente orden en la lnea de comandos : javac ServerTime.java Lance la ejecucin del servidor mediante la orden: java ServerTime Puede comprobar el funcionamiento del servidor mediante el uso del programa client Cliente UDP. Cdigo JAVA El lado cliente de una aplicacin UDP descansa en la clase DatagramSocket. De nuevo, mucho del trabajo necesario para establecer la conexin lo ha realizado la clase DatagramSocket junto a la clase DatagramPacket. import java.net.*; public class GetDate { final static int PORT_DAYTIME = 8050; // Puerto asignado para la comunicacin con el servidor public static void main (String args[]) throws Exception { DatagramSocket dgSocket; DatagramPacket datagram; InetAddress destination; byte msg[] = new byte[1024]; // Se establece en socket bajo UDP dgSocket = new DatagramSocket(); //se recoge el destino del servidor, que se le pasa como parmetro destination = InetAddress.getByName (args[0]); //se crea un DATAGRAMA, con el mensaje, la longitud, la direccin y el puerto datagram = new DatagramPacket (msg, msg.length, destination, PORT_DAYTIME); //se enva el datagrama dgSocket.send(datagram); datagram = new DatagramPacket (msg, msg.length); //se espera que llegue respuesta desde el servidor dgSocket.receive(datagram); //ha llegado un datagrama, para ver los datos se utiliza getDAta() String received = new String (datagram.getData()); System.out.println ("DATOS DEL DATAGRAMA: " + received ); //se cierra el socket UDP dgSocket.close(); } } // final de la clase cliente El siguiente cdigo muestra un ejemplo de comunicacin bajo UDP, el cliente conecta con el servidor en el puerto 8050, este servidor devolver la hora del sistema en un datagrama. En la ejecucin del cliente, deber pasarle como parmetro el nombre o direccin del servidor. Ejemplo: Java GetDate localhost En este ejemplo, el cliente establecer la comunicacin en el puerto 8050 y en el ordenador local, ya que como parmetro se le ha pasado localhost.