Netty源码分析之accept

处理客户端新连接请求的方法从org.jboss.netty.channel.socket.nio.AbstractNioSelector.run()开始分析。

NioServerBoss是AbstractNioSelector的子类,处理服务器端接收新请求的处理类selector。如果有多个selector,可以创建bosspool时设置多个selector实例,新的绑定地址bind任务将依次均匀的添加到各个boss任务队列中。详见“Netty源码分析之线程模型”。

回到AbstractNioSelector.run()方法,它主要以死循环的方式做了以下几件事情:
1.首先设置原子变量wakenUp为false
2.开始阻塞监听selector.select(),退出阻塞的原因可能是有socket事件select正常返回或者被其它线程主动唤醒(如有新的bind 注册任务时)。
3.退出阻塞后,首先运行任务队列中任务(新bind时的注册accept事件任务)。然后再在NioServerBoss的process中处理selector中各个Key。
4.对于每个selectionKey,依次通过socket.accept返回新的channel,向上行流发送OPEN事件,再把已连接channel注册到NioWorker(另一类selector)中。
for (Iterator<SelectionKey> i = selectedKeys.iterator(); i.hasNext();) {
            SelectionKey k = i.next();
            i.remove();
            NioServerSocketChannel channel = (NioServerSocketChannel) k.attachment();

            try {
                // accept connections in a for loop until no new connection is ready
                for (;;) {
                    SocketChannel acceptedSocket = channel.socket.accept();
                    if (acceptedSocket == null) {
                        break;
                    }
                    registerAcceptedChannel(channel, acceptedSocket, thread);
                }
            }


5.注册过程如同bind一样,创建注册任务并添加到下一个NioWorker的任务队列中,并唤醒对应处理阻塞中的selector。注册任务包括:向worker的selector注册read事件,成功后向上行流通道传递CONNECTED事件。

猜你喜欢

转载自xklin04.iteye.com/blog/1872668