Java NIO 簡單經典示例

          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

          導航

          統計

          公告

          常用鏈接

          留言簿

          隨筆分類(17)

          隨筆檔案(15)

          文章分類(4)

          文章檔案(5)

          收藏夾(4)

          Algorithm

          Design

          Environment Setup

          Installer

          Maven

          MINA

          OS

          Skills for Java

          VIM

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 襄城县| 时尚| 南投县| 久治县| 万全县| 斗六市| 克拉玛依市| 杂多县| 延寿县| 新安县| 湘阴县| 潼南县| 伊金霍洛旗| 周宁县| 神木县| 武穴市| 浦城县| 永福县| 聊城市| 平泉县| 周口市| 永春县| 山东| 筠连县| 云梦县| 吴桥县| 古田县| 固原市| 武宁县| 轮台县| 长阳| 平凉市| 建湖县| 泽库县| 黎平县| 昭苏县| 博湖县| 肃南| 乐东| 深水埗区| 布尔津县|