package smtp; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import csc4509.Message; import csc4509.ReadMessageStatus; public class Serveur { public static void main(String[] argv) { ReadMessageStatus rms = null; if (argv.length != 1) { System.out.println("usage: java MainTcpNioServer <port>"); return; } try { ServerSocketChannel ssc = ServerSocketChannel.open(); /* Socket non bloquant */ ssc.configureBlocking(false); ServerSocket ss = ssc.socket(); InetSocketAddress rcvAddress = new InetSocketAddress( Integer.parseInt(argv[0]) ); ss.bind( rcvAddress ); /* Initalisation du Selector */ Selector selector = Selector.open(); ssc.register(selector, SelectionKey.OP_ACCEPT); HashMap<SelectionKey,SmtpSession> hm = new HashMap<SelectionKey,SmtpSession>(); /* Socket en écoute */ while (true) { /* Init selector */ selector.select(); Set<SelectionKey> readyKeys = selector.selectedKeys(); Iterator<SelectionKey> iterator = readyKeys.iterator(); while (iterator.hasNext()) { SelectionKey key = (SelectionKey) iterator.next(); if (key.isValid() && key.isAcceptable()) { /* Accepter une nouvelle connexion */ SocketChannel sc = ssc.accept(); sc.configureBlocking(false); /* Nouvelle session SMTP */ SmtpSession sess = new SmtpSession(sc); /* Ajout de cette connexion au selector */ SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ); /* Sauvegarde du mesasge dans hashmap */ hm.put(newKey, sess); iterator.remove(); System.out.println("Nouveau client:"); } else if (key.isValid() && key.isReadable()) { SocketChannel sc = (SocketChannel)key.channel(); SmtpSession sess = hm.get(key); iterator.remove(); } else if (!key.isValid()) { hm.remove(key); iterator.remove(); } } } } catch (SocketException se) { se.printStackTrace(); return; } catch (UnknownHostException ue) { ue.printStackTrace(); return; } catch (IOException ie) { ie.printStackTrace(); return; } } }