EchoDatagramServer.java

package fr.umlv.ji.udp;
import java.io.*;
import java.nio.*;
import java.net.*;
import java.nio.channels.*;
import java.util.logging.*;
/**
 * Un serveur Echo pour le protocole UDP.
 */
public class EchoDatagramServer {
  /** Canal vers la socket UDP. */
  private DatagramChannel channel;
  /** Tampon de réception. */
  private ByteBuffer byteB;
  /** Journaliseur. */
  final static Logger logger
    = Logger.getLogger("fr.umlv.ji.udp.EchoDatagramServer");
  /** Constructeur. */
  public EchoDatagramServer(int port) throws IOException {
    // Création du tampon de réception
    byteB = ByteBuffer.allocate(1000);
    // Création du canal
    channel = DatagramChannel.open();
    // Récupération de la socket
    DatagramSocket socket = channel.socket();
    // Création de l'adresse locale d'attachement
    InetSocketAddress address = new InetSocketAddress(port);
    // Attachement de la socket au port local
    socket.bind(address);
  }
  /** Méthode de démarrage du serveur. */
  public void run() {
    try {
      logger.info("Server started on port " +
          channel.socket().getLocalPort());
      try {
    while (true) {
      // Attente de réception de données
      SocketAddress sender = channel.receive(byteB);
      // Préparation du tampon pour l'émission
      byteB.flip();
      // Affichage de l'adresse du client
      System.err.println(sender);
      // Retour des données à l'envoyeur
      channel.send(byteB,sender);
      // Réinitialisation du tampon
      byteB.clear();
    }
      } finally {
    channel.close();
      }
    } catch (IOException e) { }
  }
  public static void main(String[] args) throws IOException {
    if (args.length!=1) {
      System.err.println("Usage: " +
         "java fr.umlv.ji.udp.EchoDatagramServer <port>");
      System.exit(1);
    }
    int port = Integer.parseInt(args[0]);
    new EchoDatagramServer(port).run();
  }
}