AcceptHandler.java

package fr.umlv.ji.tcp.redirector;
import java.io.*;
import java.net.*;
import java.nio.channels.*;
/**
 * Classe d'acceptation des connexions entrantes.
 */
public class AcceptHandler implements Handler {
  /** Adresse de la socket serveur. */
  protected SocketAddress server;
  /** Constructeur, qui spécifie le serveur vers lequel rediriger. */
  public AcceptHandler(SocketAddress server) {
    this.server = server;
  }
  /** Accepte une connexion entrante et initialise une sortante. */
  public void performs(SelectionKey sk) {
    // Récupérer le canal du serveur local (proxy)
    ServerSocketChannel ssc = (ServerSocketChannel) sk.channel();
    // Accepter une connexion pendante (entrante)
    SocketChannel sc;
    try { sc = ssc.accept(); } catch (IOException e) { return; }
    if (sc!=null) {
      System.err.print("Accepting connection from " +
               sc.socket().getRemoteSocketAddress());
      SocketChannel scServer = null;
      try {
    // Mettre la connexion entrante en mode non bloquant
    sc.configureBlocking(false);
    // Créer une nouvelle socket vers le serveur où rediriger
    scServer = SocketChannel.open();
    // Placer cette socket (sortante) en mode non bloquant
    scServer.configureBlocking(false);
    // Initier la connexion vers le serveur où rediriger
    scServer.connect(server);
    // Récupérer le sélecteur de la clé de sélection
    Selector selector = sk.selector();
    // Enregistrer la socket auprès du sélecteur pour attendre
    // l'acceptation de connexion (attache un gest. de connection)
    scServer.register(selector, SelectionKey.OP_CONNECT,
              new ConnectHandler(sc));
      } catch (IOException e) {
    try { sc.close(); } catch (IOException ex) { }
    if (scServer!=null)
      try { scServer.close(); } catch (IOException ex) { }
      }
    }
  }
}