import java.io.*;
import java.net.*;
import java.util.*;

/*
 * Un cliente que genera peticiones ping sobre UDP.
 */

public class PingClient {
    public static final String CRLF="\r\n";
    
    public static void main(String[] args) throws Exception {

	/* Comprobamos que se han introducido los parámetros de entrada
	   desde la línea de comandos. */
	if (args.length != 2) {
	    System.out.println("You must specify a server and a port");
	    return;
	}
	
	/* Obtenemos la dir IP del servidor a partir de su nombre. */
	InetAddress serverAddress = InetAddress.getByName(args[0]);
	
	/* Obtenemos el puerto en el que escucha el servidor. */
	int serverPort = Integer.parseInt(args[1]);
	
	/* Creamos un socket de tipo DatragramSocket para recibir y
	 * enviar paquetes UDP. */
	DatagramSocket socket = new DatagramSocket();
	
	/* Asignamos un tiempo máximo de espera de recepción a través
	 * de este socket (time-out) de un segundo. */
	socket.setSoTimeout(1000);
	
	/* Creamos la estructura de datos que almacenará un paquete UDP. */
	DatagramPacket reply = new DatagramPacket(new byte[1024], 1024);
	
	/* Enviamos los 10 paquetes. */
	for (int i=0; i<10; ++i) {
	    
	    /* Generamos el payload del paquete con el instante en que
	     * el mismo es generado. */
	    long sendingDate = (new Date()).getTime();
	    String payload = "Ping " + (i+1) + " " + sendingDate + CRLF;
	    DatagramPacket request =
		new DatagramPacket(payload.getBytes(),
				   payload.getBytes().length,
				   serverAddress,
				   serverPort);
	    
	    System.out.print("Packet sent with payload: " + payload);
	    
	    /* Enviámos el paquete. */
	    socket.send(request);

	    /* Esperamos la respuesta del servidor. */
	    try {
		socket.receive(reply);
	    }
	    catch(SocketTimeoutException e) {
		/* Se ha producido un time-out. */
		System.out.println("Not response from server");
		continue;
	    }
	    
	    /* Calculamos el tiempo que el paquete ha tardado en regresar. */
	    long receivingDate = (new Date()).getTime();
	    System.out.println("Packet received after " +
			       (receivingDate-sendingDate) + " miliseconds");
	}
    }
}
