DaytimeUDPClient.java

package fr.umlv.ji.udp;
import java.io.*;
import java.net.*;
import java.util.logging.*;
/** Classe d'un client UDP pour le protocole Daytime (RFC 867). */
public class DaytimeUDPClient {
  // Récupération du journaliseur
  final static Logger logger
    = Logger.getLogger("fr.umlv.ji.udp.DaytimeUDPClient");
  
  // Port réservé pour le protocole Daytime
  final static int DAYTIME_PORT = 13;
  // Taille fixe de la zone stockage pour la réception
  final static int BUF_SIZE = 100;
  /**
   * Méthode de test. Envoi un datagramme (vide) à un serveur UDP Daytime,
   * recoit le datagramme réponse et affichage de l'heure reçue.
   */
  public static void main(String[] args) throws IOException {
    // Vérification de présence de paramètres sur la ligne de commande
    if (args.length != 1 && args.length != 2) {
      System.err.println("Usage: "
                +"java fr.umlv.ji.udp.DaytimeUDPClient <machine> <port>");
      System.exit(1);
    }
    // En l'absence du second argument sur la ligne de commande, le
    // port du serveur est affecté au port réservé DAYTIME_PORT
    int port = DAYTIME_PORT;
    if (args.length == 2)
      port = Integer.parseInt(args[1]);
    // Récupération de l'adresse de socket du service Daytime à contacter
    InetAddress serverAddress = InetAddress.getByName(args[0]);
    SocketAddress serviceAddr = new InetSocketAddress(serverAddress,port);
    // Allocation d'une zone de stockage (utilisée pour la réception)
    byte[] buf = new byte[BUF_SIZE];
    // Construction du datagramme à émettre (aucun octet à envoyer)
    DatagramPacket packet = new DatagramPacket(buf,0,0,
                           serverAddress,port);
    // Construction de la socket et émission du datagramme
    DatagramSocket socket = new DatagramSocket();
    logger.fine("Émission de " + packet.getLength() +
        " octet(s) vers " + packet.getSocketAddress());
    socket.send(packet);
    // Modification de l'objet datagramme pour réception et attente
    packet.setLength(BUF_SIZE);
    socket.receive(packet);
    // Récupération et affichage du contenu du datagramme reçu
    logger.fine("Réception de " + packet.getLength() +
        " octet(s) de "+ packet.getSocketAddress());
    String date =
      new String(packet.getData(),packet.getOffset(),packet.getLength());
    System.out.println(date);
    // Fermeture de la socket locale
    socket.close();
  }
}