Taller de Prácticas : Cliente y Servidor UDP en Java

Escrito por Sergio De Luz
GNU Linux
4

Os presento una aplicación hecha en Java por mí.

Consiste en un Cliente / Servidor UDP muy sencillo, el funcionamiento es el siguiente:

– En el cliente ponemos una palabra, el servidor la leerá y la transformará en mayúsculas, a continuación el servidor se la manda al cliente junto con la IP y el puerto usado por el cliente.
– Podremos 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 activamos el cliente antes de abrir el servidor no nos saldrá como en TCP ya que UDP es no conectivo y no fiable, no orientado a conexión.

El código no es, ni mucho menos perfecto, siempre se puede mejorar, pero espero que os de una idea de lo que hay que hacer para hacer por ejemplo, un cliente / servidor FTP…o un cliente de email.

Modo de ejecución (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 );
 }
 }
 }
 }

Si lo copiáis y pegáis, el código funcionará perfectamente y sin fallos.

Ahora vamos 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 direccion 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 numero de argumentos es erroneo, minimo direccion y palabra: d direccion 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 ponemos 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 ponemos 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();
 }
 }

Copiáis, compiláis y ejecutáis, funcionará cuasi-perfectamente.

¿Os gusta Java? Próximamente más.

Reto: Adivinad qué está mal en este código y cómo se puede solucionar de una forma fácil.


Continúa leyendo
  • phoenix

    por favor ayuda en esto soy nuevo en programacion.. al momento de compilarlo me dice q no e especificado ip y sinceramnete onse donde se pone porq donde supuestamente va me sale error por favoar si alguien sabe se lo agradeceria mucho

    • Mete la dirección IP manualmente, luego si eso introduces la IP por parámetros o lo que sea.

  • error

    deberias comentar tus lineas de codigo como un programador serio en lugar de tirar codigo y sentirte el mejor solo por ponerlo.

  • Pingback: La capa de transporte en Internet : UDP a fondo. Volumen III()

  • Jose

    Tiene que hablar con su compañía de adsl y que le direccione el puerto 80 en tcp y udp a la ip 192.168.1.101.
    He de hacer esto en un nucom r5500
    Me puede explicar
    Gracias