Java NIO 簡單經(jīng)典示例

          Java NIO 主要是Channel, SelectionKey, Selector 三個類之間的關系,下面的例子就是演示如果使用NIO來處理請求的:/**
           * 
           */
          package dongzi.nio.exercise.nio;

          import java.io.IOException;
          import java.net.InetSocketAddress;
          import java.net.ServerSocket;
          import java.nio.ByteBuffer;
          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.Iterator;

          /**
           * 
          @author kyle
           * 
           
          */
          public class SelectSockets {

              private static final int PORT_NUMBER = 1234;

              /**
               * 
          @param args
               
          */
              public static void main(String[] args) {
                  new SelectSockets().go(args);
              }

              private void go(String[] args) {
                  int port = PORT_NUMBER;
                  if (args.length > 0) {
                      try {
                          port = Integer.parseInt(args[0]);
                      } catch (Exception e) {
                      }
                  }

                  System.out.println("Listening port: " + PORT_NUMBER);
                  try {
                      Selector selector = Selector.open();
                      startServer(port, selector);
                      while (true) {
                          int n = selector.select();
                          if (n == 0) {
                              continue;
                          }

                          Iterator it = selector.selectedKeys().iterator();
                          while (it.hasNext()) {
                              SelectionKey key = (SelectionKey) it.next();
                              if (key.isAcceptable()) {
                                  ServerSocketChannel server = (ServerSocketChannel) key
                                          .channel();
                                  SocketChannel channel = server.accept();
                                  registerChannel(selector, channel, SelectionKey.OP_READ);
                                  sayHello(channel);

                              }
                              if (key.isReadable()) {
                                  readDataFromChannel(key);
                              }
                          }

                          it.remove();
                      }
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }

              private ByteBuffer buffer = ByteBuffer.allocate(1024);

              private void readDataFromChannel(SelectionKey key) throws IOException {
                  int count = 0;
                  SocketChannel channel = (SocketChannel) key.channel();
                  buffer.clear();
                  while ((count = channel.read(buffer)) > 0) {
                      buffer.flip();
                      while (buffer.hasRemaining()) {
                          System.out.println(buffer.get());
                      }
                      buffer.clear();
                  }
                  if (count < 0) {
                      channel.close();
                  }

              }

              private void sayHello(SocketChannel channel) throws IOException {
                  if (channel == null) {
                      return;
                  }
                  buffer.clear();
                  ByteBuffer buffer = ByteBuffer.wrap("Hi, there \r\n".getBytes());
                  buffer.flip();
                  channel.write(buffer);
              }

              private void registerChannel(Selector selector, SocketChannel channel,
                      int opRead) throws IOException {

                  if (channel == null) {
                      return;
                  }

                  channel.configureBlocking(false);
                  channel.register(selector, opRead);
              }

              private void startServer(int port, Selector selector) throws IOException,
                      ClosedChannelException {
                  ServerSocketChannel serverChannel = ServerSocketChannel.open();
                  serverChannel.configureBlocking(false);
                  ServerSocket serverSocket = serverChannel.socket();
                  serverSocket.bind(new InetSocketAddress(port));
                  serverChannel.register(selector, SelectionKey.OP_ACCEPT);
              }

          }


          Kyle Wang

          posted on 2012-09-26 22:40 王樹東 閱讀(4370) 評論(0)  編輯  收藏 所屬分類: Java Skills Learning and Sharing

          <2012年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統(tǒng)計

          公告

          常用鏈接

          留言簿

          隨筆分類(17)

          隨筆檔案(15)

          文章分類(4)

          文章檔案(5)

          收藏夾(4)

          Algorithm

          Design

          Environment Setup

          Installer

          Maven

          MINA

          OS

          Skills for Java

          VIM

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 静海县| 安顺市| 井研县| 乌兰察布市| 云南省| 常熟市| 灵川县| 台中县| 伊宁县| 枣强县| 保德县| 明光市| 南宁市| 南阳市| 潜山县| 绍兴县| 抚远县| 高碑店市| 孟村| 甘德县| 岳阳县| 茶陵县| 长海县| 和顺县| 堆龙德庆县| 色达县| 顺平县| 封丘县| 永德县| 诸暨市| 临沧市| 宁武县| 缙云县| 澄城县| 河北省| 延吉市| 合川市| 六盘水市| 西畴县| 金昌市| 大姚县|