EchoStreamServer.java

package fr.umlv.ji.tcp;
import java.io.*;
import java.nio.*;
import java.net.*;
import java.nio.channels.*;
import java.util.logging.*;
/**
 * Un serveur Echo pour le protocole TCP.
 */
public class EchoStreamServer implements Runnable {
  /** Socket pour la mise en attente des connexions. */
  ServerSocketChannel ssc = ServerSocketChannel.open();
  /** Journaliseur. */
  final static Logger logger =
    Logger.getLogger("fr.umlv.ji.tcp.EchoStreamServer");
  /** Constructeur, qui attache la socket au port. */
  public EchoStreamServer(int port) throws IOException {
    ServerSocket socket = ssc.socket();
    socket.bind(new InetSocketAddress(port));
  }
  /** Méthode de démarrage du serveur. */
  public void run() {
    logger.info("Echo server started on port: " +
        ssc.socket().getLocalPort());
    // Allocation du tampon pour la lecture et l'écriture
    ByteBuffer byteB = ByteBuffer.allocateDirect(1000);
    try {
      while (true) {
    // Acceptation d'une nouvelle connexion
    SocketChannel sc = ssc.accept();
    try {              // Renvoyer tout ce qui est lu
      while ((sc.read(byteB))!=-1) {
        byteB.flip();
        sc.write(byteB);
        byteB.clear();
      }
    } catch (IOException e) {
      System.err.println(e);
    } finally {
      // Fermer la socket de connexion, quoi qu'il arrive
      try { sc.close(); } catch (IOException e) { }
    }
      }
    } catch (IOException ex) {
      System.err.println(ex);
    } finally {
      // Fermer la socket serveur en cas d'erreur
      try { ssc.close(); } catch (IOException ex) { }
    }
  }
  /** Méthode de test. */
  public static void main(String[] args) throws IOException {
    int port = 7777;
    if (args.length==1) {
      try {
    port = Integer.parseInt(args[0]);
      } catch (NumberFormatException e) {
    System.err.println("Usage: " +
               "java fr.umlv.ji.tcp.EchoStreamServer <port>");
    System.exit(1);
      }
    }
    new EchoStreamServer(port).run();
  }
}