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>
[java]
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 );
}
}
}
}
[/java]
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)>
[java]
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();
}
}
[/java]
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.