package asyncnio; 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 { boolean debug = false; public static void main(String[] argv) { 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,Message> hm = new HashMap<SelectionKey,Message>(); /* 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.isAcceptable()) { /* Accepter une nouvelle connexion */ SocketChannel sc = ssc.accept(); sc.configureBlocking(false); /* Creation du thread pour traitement Recepteur t = new Recepteur(sc); t.run(); */ /* Nouveau message */ Message mess = new Message(1); /* Ajout de cette connexion au selector */ SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ); /* Sauvegarde du mesasge dans hashmap */ hm.put(newKey, mess); iterator.remove(); } else if (key.isReadable()) { SocketChannel sc = (SocketChannel)key.channel(); Message mess = hm.get(key); /* Read */ ReadMessageStatus rms = mess.readMessage(sc); if (rms == ReadMessageStatus.ReadDataCompleted) { String s = null; try { s = (String) mess.getData(); } catch (IOException e) { e.printStackTrace(); } System.out.println(s); } else if (rms == ReadMessageStatus.ChannelClosed) { hm.remove(key); } iterator.remove(); } else if (key.isWritable()) { } } } } catch (SocketException se) { se.printStackTrace(); return; } catch (UnknownHostException ue) { ue.printStackTrace(); return; } catch (IOException ie) { ie.printStackTrace(); return; } } }