Java NIO 简单经典示例

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

你可能感兴趣的:(Java NIO 简单经典示例)