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); } } }