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 王树东 阅读(4343) 评论(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

搜索

最新评论

阅读排行榜

评论排行榜