Netty 快速入门系列 - Chapter 2 Netty3.x 【第五讲】 - 源码讲解


Netty3.X 源码: https://download.youkuaiyun.com/download/netcobol/10309152


Netty3.X 源码讲解

  
ServerBootstrap.bind(new InetSocketAddress(port))

   bind 将调用ServerBootstrap.bindAsync 方法,完成初始化 nio ServerSocketChannel,
   
   Binder通过ChannelPipeline.addLast()添加到Pipeline中,如何触发Pipeline?;


   Binder 是一个 SimpleChannelUpstreamHandler 其中关键方法是 
   
   public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) 


   根据不同的ChannelEvent,匹配不同的业务操作,这里重点关注


   如果 e 是一个 ChannelStateEvent,同时 status == OPEN


   将会调用channelOpen方法,可以通过子类实现具体的操作。


   Binder  的 channelOpen 方法:
   
   通过event 获取 Channel (ServerSocketChannel)
   evt.getChannel().bind(localAddress)




   触发Pipeline:
   
   Channel channel = getFactory().newChannel(bossPipeline); 
   
   通过Factory的 NioServerSocketChannelFactory.newChannel 触发Pipeline
   
   public ServerSocketChannel newChannel(ChannelPipeline pipeline) {
    	
        return new NioServerSocketChannel(this, pipeline, sink, bossPool.nextBoss(), workerPool);
    }
    
    构建 NioServerSocketChannel 类


    初始化 ServerSocketChannel.open() 与 socket.configureBlocking(false);


    最后调用Channels.fireChannelOpen(this),当Open Server  Socket Channel;  


    StatusEvent: ChannelState.OPEN value: Boolean.TRUE


    channel.getPipeline().sendUpstream(new UpstreamChannelStateEvent(channel, ChannelState.OPEN, Boolean.TRUE));




    然后 调用 NioServerSocketChannel.bind方法 (AbstractChannel),主要发送bind event
    
    public ChannelFuture bind(SocketAddress localAddress) {
    	
        return Channels.bind(this, localAddress);
    }
    
    Channels.bind() DownstreamChannelStateEvent status bound value: address
    channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent(channel, future, ChannelState.BOUND, localAddress));


    由于PiplelineChannel sendDownstream 方法中
    如果getActualDownstreamContext 没有Downstream next (header 到头了)


    将调用sink.eventSunk方法


     NioServerSocketPipelineSink. eventSunk 方法


       Channel channel = e.getChannel();


	if (channel instanceof NioServerSocketChannel) {
		handleServerSocket(e);
	} else if (channel instanceof NioSocketChannel) {
		handleAcceptedSocket(e);
	}


      当 Channel == NioServerSocketChannel


      Event Status:BOUND


     ((NioServerBoss) channel.boss).bind(channel, future, (SocketAddress) value);




      NioServerBoss.bind 方法
     
      registerTask(new RegisterTask(channel, future, localAddress)) 其中 RegisterTask run 方法


       channel.socket.socket().bind(localAddress, channel.getConfig().getBacklog()); bind port


       call Channels.fireChannelBound() 


       channel.getPipeline().sendUpstream(new UpstreamChannelStateEvent(channel, ChannelState.BOUND, localAddress))


       channel.socket.register(selector, SelectionKey.OP_ACCEPT, channel)


       NioServerBoss.process 方法
       
       registerAcceptedChannel(channel, acceptedSocket, thread)
      
       NioWorker worker = NioServerSocketChannel.workerPool.nextWorker();
       
        worker.register(new NioAcceptedSocketChannel(parent.getFactory(), pipeline, parent, sink, acceptedSocket,
					worker, currentThread), null);


        NioAcceptedSocketChannel 构造器 调用 Channels.fireChannelOpen(this);  Channel:SocketChannel


       channel.getPipeline().sendUpstream(new UpstreamChannelStateEvent(channel, ChannelState.OPEN, Boolean.TRUE));


       NioWorker.register 方法


       Runnable task = createRegisterTask(channel, future);


        createRegisterTask 方法


      new RegisterTask((NioSocketChannel) channel, future, server);
       
       RegisterTask 构造器


       channel.channel.configureBlocking(false);
                
       channel.channel.register( selector, channel.getInternalInterestOps(), channel);   

UML 图解说


所有源码下载 :https://download.youkuaiyun.com/download/netcobol/10308871

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值