Apache MINA NioSocketAcceptor类的实现

NioSocketAcceptor 继承AbstractPollingIoAcceptor,实现SocketAcceptor接口

public final class NioSocketAcceptor extends AbstractPollingIoAcceptor<NioSession, ServerSocketChannel> implements SocketAcceptor {}

 

成员变量:

private volatile Selector selector;

volatile 修饰词的使用:http://developer.zdnet.com.cn/2007/1107/612888.shtml

 

实现方法:

    @Override
    protected void init() throws Exception {
        //初始化selector 
        selector = Selector.open();
    }
 @Override
    protected ServerSocketChannel open(SocketAddress localAddress) throws Exception {
        // 创建ServerSocket通道
        ServerSocketChannel channel = ServerSocketChannel.open();

        boolean success = false;

        try {
            // 设置非阻塞的socket通道
            channel.configureBlocking(false);

            // 获取ServerScoket
            ServerSocket socket = channel.socket();

            // Set the reuseAddress flag accordingly with the setting
            socket.setReuseAddress(isReuseAddress());

            // 绑定监听地址和端口号
            socket.bind(localAddress, getBacklog());

            // 在selector中注册
            channel.register(selector, SelectionKey.OP_ACCEPT);
            success = true;
        } finally {
            if (!success) {
                close(channel);
            }
        }
        return channel;
    }

 

    @Override
    protected int select() throws Exception {
        return selector.select();
    }

 

    @Override
    protected Iterator<ServerSocketChannel> selectedHandles() {
        return new ServerSocketChannelIterator(selector.selectedKeys());
    }

 

    @Override
    protected void close(ServerSocketChannel handle) throws Exception {
        SelectionKey key = handle.keyFor(selector);

        if (key != null) {
            key.cancel();
        }

        handle.close();
    }


        public ServerSocketChannel next() {
            SelectionKey key = iterator.next();

            if (key.isValid() && key.isAcceptable()) {
                return (ServerSocketChannel) key.channel();
            }

            return null;
        }

 

posted @ 2013-07-11 17:50  独行码夫  阅读(1586)  评论(0编辑  收藏  举报