Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 14th, 2012  |  syntax: Java  |  size: 4.25 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. import java.io.IOException;
  2. import java.io.RandomAccessFile;
  3. import java.lang.StringBuilder;
  4. import java.net.InetSocketAddress;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import java.nio.ByteBuffer;
  8. import java.nio.channels.FileChannel;
  9. import java.nio.channels.SelectionKey;
  10. import java.nio.channels.Selector;
  11. import java.nio.channels.ServerSocketChannel;
  12. import java.nio.channels.SocketChannel;
  13. import java.nio.CharBuffer;
  14. import java.nio.charset.Charset;
  15. import java.nio.charset.CharsetDecoder;
  16. import java.util.HashMap;
  17. import java.util.Iterator;
  18. import java.util.Map;
  19. import java.util.Set;
  20.  
  21. class Server {
  22.     private final int port;
  23.     private final ByteBuffer readBuffer;
  24.     private final Map<SelectionKey, BufferEntry> buffers;
  25.  
  26.     Server(int port) throws IOException {
  27.         this.port = port;
  28.         readBuffer = ByteBuffer.allocate(10000);
  29.         buffers = new HashMap<SelectionKey, BufferEntry>();
  30.     }
  31.  
  32.     public void go() throws IOException {
  33.         ServerSocketChannel ssc = ServerSocketChannel.open();
  34.         ssc.configureBlocking(false);
  35.         ServerSocket ss = ssc.socket();
  36.         InetSocketAddress isa = new InetSocketAddress(port);
  37.         ss.bind(isa);
  38.         Selector selector = Selector.open();
  39.         ssc.register(selector, SelectionKey.OP_ACCEPT);
  40.         System.out.println("Listening on port " + port);
  41.  
  42.         while (true) {
  43.             if (selector.select() != 0) {
  44.                 Set<SelectionKey> keys = selector.selectedKeys();
  45.                 for (SelectionKey key : keys) {
  46.                     if (key.isAcceptable()) {
  47.                         accept(selector, ss.accept());
  48.                     } else if (key.isReadable()) {
  49.                         read(selector, key);
  50.                     } else if (key.isWritable()) {
  51.                         write(selector, key);
  52.                     }
  53.                 }
  54.                 keys.clear();
  55.             }
  56.         }
  57.     }
  58.  
  59.     private void accept(Selector selector, Socket s) throws IOException {
  60.         System.out.println("Got connection from " + s);
  61.         SocketChannel sc = s.getChannel();
  62.         sc.configureBlocking(false);
  63.         sc.register(selector, SelectionKey.OP_READ);
  64.     }
  65.  
  66.     private void read(Selector selector, SelectionKey key) throws IOException {
  67.         SocketChannel sc = (SocketChannel) key.channel();
  68.         if (readBuffer.limit() == 0) {
  69.             key.cancel();
  70.             Socket s = sc.socket();
  71.             s.close();
  72.         } else {
  73.             readBuffer.clear();
  74.             sc.read(readBuffer);
  75.             readBuffer.flip();
  76.  
  77.             String filePath = "./mountain.jpg";
  78.             System.out.println("Sending file '" + filePath + "' to " + sc);
  79.  
  80.             sc.register(selector, SelectionKey.OP_WRITE);
  81.             buffers.put(key, new BufferEntry(filePath));
  82.         }
  83.     }
  84.  
  85.     private class BufferEntry {
  86.         private FileChannel chan;
  87.         private ByteBuffer buf;
  88.  
  89.         public BufferEntry(String filePath) throws IOException {
  90.             chan = new RandomAccessFile(filePath, "r").getChannel();
  91.             buf = chan.map(FileChannel.MapMode.READ_ONLY, 0, chan.size());
  92.         }
  93.  
  94.         public void close() throws IOException {
  95.             chan.close();
  96.         }
  97.     }
  98.  
  99.     private void write(Selector selector, SelectionKey key) throws IOException {
  100.         SocketChannel sc = (SocketChannel) key.channel();
  101.         BufferEntry entry = buffers.get(key);
  102.         if (entry == null) {
  103.             key.cancel();
  104.             Socket s = sc.socket();
  105.             s.close();
  106.         } else {
  107.             sc.write(entry.buf);
  108.             if (entry.buf.hasRemaining()) {
  109.                 sc.register(selector, SelectionKey.OP_WRITE);
  110.             } else {
  111.                 key.cancel();
  112.                 buffers.remove(key);
  113.                 Socket s = sc.socket();
  114.                 s.flush();
  115.                 s.close();
  116.             }
  117.         }
  118.     }
  119.  
  120.     public static void main(String[] args) {
  121.         try {
  122.             Server serv = new Server(9999);
  123.             serv.go();
  124.         } catch (IOException e) {
  125.             System.err.println("Error in server");
  126.             System.err.println(e.getMessage());
  127.             System.exit(1);
  128.         }
  129.     }
  130. }