Bueno, he codificado un cliente-servidor UDP pero mi servidor no logra recibir el paquete datagrama enviado por el cliente ._.
¿Alguna ayudita?
ClienteUDP,java
package proyecto.socketudp;
import java.net.*;
/** Ejemplo que implementa un cliente de eco usando UDP. */
public class ClienteUDP {
public static void main(String argv[]) {
if (argv.length != 3) {
System.err.println("Formato: ClienteUDP <maquina> <puerto> <mensaje>");
System.exit(-1);
}
DatagramSocket sDatagram = null;
try {
// Creamos el socket no orientado a conexión
// (en cualquier puerto libre)
sDatagram = new DatagramSocket();
// Establecemos un timeout de 30 segs
sDatagram.setSoTimeout(30000);
// Obtenemos la dirección IP del servidor
// (recibida en el primer argumento por linea de comandos)
InetAddress dirServidor = InetAddress.getByName(argv[0]);
// Obtenemos el puerto del servidor
// (recibido en el segundo argumento por linea de comandos)
int puertoServidor = Integer.parseInt(argv[1]);
// Obtenemos el mensaje
// (tercer argumento de la linea de comandos)
String mensaje = argv[2];
byte[] envInfo = new byte[1024];
envInfo = mensaje.getBytes();
// Preparamos el datagrama que vamos a enviar y lo enviamos
DatagramPacket envPaquete = new DatagramPacket(
envInfo, envInfo.length,
dirServidor, puertoServidor
);
// Enviamos el datagrama
sDatagram.send(envPaquete);
System.out.println(
"CLIENTE: Enviando "
+ new String(envPaquete.getData()) + " a "
+ envPaquete.getAddress().toString() + ":"
+ envPaquete.getPort()
);
// Preparamos el datagrama de recepción
byte[] recInfo = new byte[1024];
DatagramPacket recPaquete = new DatagramPacket(recInfo, recInfo.length);
// Recibimos el mensaje
sDatagram.receive(recPaquete);
System.out.println(
"CLIENTE: Recibido "
+ new String(recPaquete.getData(), 0, recPaquete.getLength())
+ " de " + recPaquete.getAddress().toString() + ":"
+ recPaquete.getPort()
);
} catch (SocketTimeoutException e) {
System.err.println("30 segs sin recibir nada");
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
} finally {
// Cerramos el socket para liberar la conexión
sDatagram.close();
}
}
}
ServidorUDP.java
package proyecto.socketudp;
import java.net.*;
/** Ejemplo que implementa un servidor de eco usando UDP. */
public class ServidorUDP {
public static void main(String argv[]) throws SocketException {
if (argv.length != 1) {
System.err.println("Formato: ServidorUDP <puerto>");
System.exit(-1);
}
try {
// Creamos el socket datagrama
DatagramSocket sDatagram = new DatagramSocket(Integer.parseInt(arv[0]));
// Establecemos un timeout de 30 segs
sDatagram.setSoTimeout(30000);
byte array[] = new byte[1024];
DatagramPacket dgramRec, dgramEnv = null;
while (true) {
// Preparamos un datagrama para recepción
dgramRec = new DatagramPacket(array, array.length);
// Recibimos el mensaje
sDatagram.receive(dgramRec);
// Recabamos informacion
String mensaje = new String(dgramRec.getData());
InetAddress dirCliente = dgramRec.getAddress();
int puertoCliente = dgramRec.getPort();
System.out.println(
"SERVIDOR: Recibido "
+ new String(dgramRec.getData(), 0, dgramRec.getLength())
+ " de " + dirCliente.toString() + ":"
+ puertoCliente
);
// Preparamos el datagrama que vamos a enviar
dgramEnv = new DatagramPacket(
mensaje.getBytes(), mensaje.getBytes().length,
dirCliente, puertoCliente
);
// Enviamos el mensaje
sDatagram.send(dgramEnv);
System.out.println(
"SERVIDOR: Enviando"
+ new String(dgramEnv.getData(), 0, dgramEnv.getLength())
+ " de " + dgramEnv.getAddress().toString() + ":"
+ dgramEnv.getPort()
);
}
} catch (SocketTimeoutException e) {
System.err.println("30 segs sin recibir nada");
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
Me respondo a mí mismo por si a alguien más le ayuda.
Al construir el DatagramSocket del servidor debí haber especificado el puerto (que se pasa como primer y único argumento al servidor) en el constructor.