DaytimeServer.java

package fr.umlv.ji.tcp;
import java.util.prefs.*;
import java.util.logging.*;
import java.net.*;
import java.io.*;
import java.util.Date;
/**
 * Classe pour un serveur de protocole Daytime (RFC 867)
 * au-dessus de TCP.
 */
public class DaytimeServer {
  /** Journaliseur de l'application. */
  final static Logger logger =
    Logger.getLogger("fr.umlv.ji.tcp.DaytimeServer");
  /** Port Daytime par défaut. */
  public final static int DEFAULT_PORT = 13;
  /** Objet socket serveur. */
  ServerSocket s;
  /** Constructeur acceptant un port d'attachement local en paramètre.
      Le port effectivement choisi est affiché. */
  public DaytimeServer(int port) throws IOException  {
    // Création de l'objet socket serveur
    s = new ServerSocket(port);
    // Affichage du port d'attachement
    logger.info("Port d'attachement : " + s.getLocalPort());
  }
  /** Méthode démarrant l'activité du serveur Daytime.
      Il attend en permanence des connexions pendantes et traite, de
      manière itérative, toutes celles qu'il accepte comme socket de
      service avant de les fermer. */
  public void launch() {
    // Attente de connexion pendante
    Socket serviceSocket;
    while (true) {
      try {
    serviceSocket = s.accept(); // acceptation d'une socket pendante
      } catch (IOException e) {
    logger.log(Level.SEVERE,"accept",e);
    break;
      }
      try {
    // Récupération d'un flot en écriture sur la socket de service
    PrintStream output =
      new PrintStream(serviceSocket.getOutputStream());
    // Écriture de la date
    output.println(new Date());
    // Fermeture de la socket de service du client
    serviceSocket.close();
      } catch (IOException e) {
    logger.log(Level.WARNING,"socket service",e);
      }
    }
  }
  /** Méthode de test. Mise en service d'un serveur Daytime,
      soit sur le port trouvé dans les préférences, soit, 
      en son absence, sur le port 13 par défaut. */
  public static void main(String[] args) {
    // Récupération des préférences utilisateur
    Preferences prefs = 
      Preferences.userNodeForPackage(fr.umlv.ji.tcp.DaytimeServer.class);
    int port = prefs.getInt("port",DEFAULT_PORT);
    try {
      // Création du serveur
      DaytimeServer server = new DaytimeServer(port);
      // Mise en service du serveur
      server.launch();
    } catch (IOException e) {
      logger.log(Level.SEVERE,"Erreur au démarrage du serveur",e);
      System.err.println("Erreur au démarrage du serveur :");
      e.printStackTrace(System.err);
    }
  }
}