置頂隨筆

          [置頂]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);
              }

          }

          posted @ 2012-09-26 22:40 王樹東 閱讀(4370) | 評論 (0)編輯 收藏

          僅列出標題  下一頁
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          公告

          常用鏈接

          留言簿

          隨筆分類(17)

          隨筆檔案(15)

          文章分類(4)

          文章檔案(5)

          收藏夾(4)

          Algorithm

          Design

          Environment Setup

          Installer

          Maven

          MINA

          OS

          Skills for Java

          VIM

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 循化| 宜章县| 梅河口市| 正镶白旗| 中山市| 通江县| 巴林左旗| 江川县| 林西县| 从江县| 仁寿县| 克拉玛依市| 棋牌| 梅河口市| 许昌县| 沁阳市| 罗定市| 吴江市| 古蔺县| 临沧市| 安顺市| 吉木乃县| 咸宁市| 合肥市| 响水县| 鄂伦春自治旗| 南陵县| 清苑县| 改则县| 聊城市| 桦川县| 库车县| 郁南县| 游戏| 藁城市| 榕江县| 台东市| 萍乡市| 赤水市| 疏勒县| 包头市|