package sendandreceive; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.channels.ClosedChannelException; 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.MessageSequenceException; public class SelectorFileServerMain { public static void main(String [] argv) { Selector selector; ServerSocketChannel listenChannel; ServerSocket listenSocket; boolean debugState = true; InetSocketAddress rcvAddress; HashMap theTxters = new HashMap(); if (argv.length != 1) { System.out.println("usage: java SelectorFileServer "); return; } // creates the selector and the listener try { selector = Selector.open(); listenChannel = ServerSocketChannel.open(); listenSocket = listenChannel.socket(); rcvAddress = new InetSocketAddress(Integer.parseInt(argv[0])); listenSocket.setReuseAddress(true); listenSocket.bind(rcvAddress); listenChannel.configureBlocking(false); selector = Selector.open(); listenChannel.register(selector, SelectionKey.OP_ACCEPT); while(true){ selector.select(); Set readyKeys = selector.selectedKeys(); if(debugState){ System.out.println("Nb Ready keys:"+readyKeys.size()); } Iterator iterator = readyKeys.iterator(); while (iterator.hasNext()) { SelectionKey key = (SelectionKey) iterator.next(); iterator.remove(); if (key.isAcceptable()) { NbFileTxter txter; SelectionKey txterKey; SocketChannel chan = listenChannel.accept(); chan.configureBlocking(false); txter = new NbFileTxter(chan); txterKey = chan.register(selector, SelectionKey.OP_READ); theTxters.put(txterKey,txter); } else if (key.isReadable()) { int messType; NbFileTxter txter = theTxters.get(key); try{ messType = txter.nbrcvFile(); }catch(MessageSequenceException me){ me.printStackTrace(); continue; } if(messType == -1){ txter.close(); theTxters.remove(key); } } } } } catch (ClosedChannelException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }