ConnectHandler.java

package fr.umlv.ji.tcp.redirector;
import java.io.*;
import java.nio.channels.*;
/**
 * Classe d'attente de connexion entre le redirecteur et le serveur.
 */
public class ConnectHandler implements Handler {
  /** Canal vers le client. */
  protected SocketChannel scClient;
  /** Constructeur, qui spécifie le canal de la connection entrante. */
  public ConnectHandler(SocketChannel scClient) {
    this.scClient = scClient;
  }
  /** Affecte des objets Connection aux deux sens de communication. */
  public void performs(SelectionKey sk) {
    SocketChannel scServer = null;
    try {
      // Récupère la socket à connecter (vers le serveur)
      scServer = (SocketChannel) sk.channel();
      // S'assure que la connexion est établie
      if (scServer.finishConnect()) {
    // Construit deux objets états des transferts pour les deux sens
    Connection clientToServer = new Connection();
    Connection serverToClient = new Connection();
    Selector selector = sk.selector(); // Récupération du sélecteur
    // Attachement pour lecture/écriture du côté client 
    RWHandler clientHandler =
      new RWHandler(serverToClient,    clientToServer, sk);
    SelectionKey clientSK = scClient.register(selector,
                          SelectionKey.OP_READ,
                          clientHandler);
    // Attachement pour lecture/écriture du coté serveur 
    RWHandler serverHandler =
      new RWHandler(clientToServer,    serverToClient, clientSK);
    // Mise à jour de l'objet attachement 
    sk.attach(serverHandler);
    // Mise à jour des opération intéressantes pour le canal
    sk.interestOps(SelectionKey.OP_READ);
      }
    } catch (Exception e) {
      // Ferme les deux connexions
      try { scClient.close(); } catch (IOException ex) {}
      if (scServer!=null) {
    try { scServer.close(); } catch (IOException ex) {}
      }
    }
  }
}