Netty3 源码分析 - NIO server接受连接请求过程分析

本文详细分析了Netty3中NIO服务器如何接收客户端连接请求的过程,从NioServerBoss的run方法开始,讨论了Selector的选择循环,以及在接收到连接后如何将任务分配给WorkerPool进行处理,最后描述了NioWorker如何处理读写服务。
摘要由CSDN通过智能技术生成
Netty3 源码分析 - NIO server接受连接请求过程分析

     当服务器端的server Channel绑定某个端口之后,就可以处理来自客户端的连接请求,而且在构建  NioServerSocketChannelFactory 的时候已经生成了对应的  BossPool 和  WorkerPool,前者管理的  NioServerBoss 就是专门用来接受客户端连接的Selector封装,当,下面是关键的代码:

1.  AbstractNioSelector中的run方法代表这个boss thread的核心工作。
public   void  run() {
         thread  = Thread. currentThread();
         // 打开闭锁;
         startupLatch .countDown();

         int  selectReturnsImmediately = 0;
        Selector selector =  this .  selector ;

         if  (selector ==  null ) {
             return ;
        }
         // use 80% of the timeout for measure
         final   long  minSelectTimeout = SelectorUtil. SELECT_TIMEOUT_NANOS  * 80 / 100;
         boolean  wakenupFromLoop =  false ;
         for  (;;) {
             wakenUp .set(  false );

             try  {
                 long  beforeSelect = System. nanoTime();
                 // 返回有多少个Channel准备好了
                 int  selected = select(selector);
                 if  (SelectorUtil.  EPOLL_BUG_WORKAROUND  && selected == 0 && !wakenupFromLoop && ! wakenUp  .get()) {
                       //上述select阻塞的时间;
                     long  timeBlocked = System. nanoTime() - beforeSelect;

                     //如果小于最小超时时间限制;
                     if  (timeBlocked < minSelectTimeout) {
                         boolean  notConnected =  false ;
                         // loop over all keys as the selector may was unblocked because of a closed channel
                         for  (SelectionKey key: selector.keys()) {
                            SelectableChannel ch = key.channel();
                             try  {
                                 if  (ch  instanceof  DatagramChannel && !ch.isOpen() ||
                                        ch  instanceof  SocketChannel && !((SocketChannel) ch).isConnected()) {
                                    notConnected = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值