DaytimeUDPServer.java

package fr.umlv.ji.udp;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.*;
/** Classe d'un serveur UDP pour le protocole Daytime (RFC 867). */
public class DaytimeUDPServer {
  // Récupération du journaliseur
  final static Logger logger
    = Logger.getLogger("fr.umlv.ji.udp.DaytimeUDPServer");
  // Port par défaut, réservé pour le protocole Daytime (RFC 867).
  final static int DAYTIME_PORT = 13;
  // Socket locale du serveur
  DatagramSocket socket;
  /**
   * Construit un serveur UDP Daytime attaché au port localPort. À la
   * fin de la construction, le serveur n'est pas encore en service,
   * mais sa méthode run() est prête à être exécutée.
   */
  public DaytimeUDPServer(int localPort) throws SocketException {
    socket = new DatagramSocket(localPort);
  }
  /**
   * Met le serveur Daytime en service. En permanence, ce dernier
   * attend la réception d'un datagramme, il y place l'heure courante
   * et le renvoie à l'émetteur.
   */
  public void run() {
    // Datagramme utilisé pour la réception et l'émission
    DatagramPacket packet;
    // Une zone de stockage (même vide) doit être allouée pour
    // pouvoir créer le datagramme.
    packet = new DatagramPacket(new byte[0],0);
    // Boucle d'attente de réception de datagramme et d'envoi de réponse
    logger.info("Serveur démarré sur "+socket.getLocalSocketAddress());
    while (true) {
      try {
    socket.receive(packet);
      } catch (IOException ioe) {
    logger.log(Level.WARNING,"Problème de réception",ioe);
    continue;
      }
      // Lorsqu'un datagramme est reçu, on convertit la date courante en
      // un tableau d'octets que l'on réfère comme zone de stockage 
      Date date = new Date();
      byte[] buf = date.toString().getBytes();
      // Mise à jour les indices de la zone de stockage dans le datagramme
      packet.setData(buf,0,buf.length);
      // Envoi de datag (qui contient déjà le port et l'adresse du client)
      try {
    socket.send(packet);
      } catch (IOException ioe) {
    logger.log(Level.WARNING,"Problème d'émission",ioe);
    continue;
      }
    }
  }
  /**
   * Méthode de test qui créé un serveur avec le port éventuellement
   * spécifié sur la ligne de commande et lance son exécution dans
   * le processus léger courant (initial) en appelant run().
   */
  public static void main(String[] args) {
    // En l'absence d'argument sur la ligne de commande, le port local 
    // par défaut du serveur est affecté au port réservé DAYTIME_PORT
    int port;
    if (args.length == 0)
      port = DAYTIME_PORT;
    // Attention, sur un système Unix ou NT, l'attachement sur le port 13
    // sera interdit si on ne possède pas les droits nécessaires.
    else
      port = Integer.parseInt(args[0]);
    // Création et démarrage du serveur UDP Daytime attaché à ce port.
    try {
      DaytimeUDPServer server = new DaytimeUDPServer(port);
      server.run();
    } catch (SocketException e) {
      System.err.println("Problème à la création du serveur : ");
      e.printStackTrace(System.err);
    }
  }
}