client启动:
server是在bootstrap.bind的时候启动,而同样,client是在bootstrap.connect时启动,流程都是一样的:创建NioSocketChannel,和workgroup中的一个eventloop绑定起来,然后再执行connect。
笔记:connect操作和write操作一样,都是客户端主动调用,然后write事件被丢到netty,而网络可读可写等事件则是由netty自动接收然后初步处理后再丢到pipeline,然后pipeline中的handler再调用我们的程序,也就是说前者是由netty外到netty内,后者是由netty内到netty外。
再举个例子:read:如果selector中注册了read事件,那么就是netty会自动读取数据然后通知你,这是由内到外,而如果selector中没有注册read事件,比如在handler的read方法中设置autoread=false会导致selector移除read事件,此时你就必须手动调用channel.read去通知read读取,这就是由外到内即由客户端代码到netty框架
笔记:ChannelDuplexHandler里的各种操作比如read/connect/bind/disconnect,这些操作都是客户端主动调用的,由外到内,比如bootstracp.bind/bootstracp.connnet/channel.write等,调用时都是一个调用链,一般只在最后一个节点才真正执行这个操作,一旦中间某个handler没有继续调用super.xxx后者ctx.xxx(super.xxx一般是直接调用ctx.xxx),那么这个操作在这里就断了,就走不到最后执行的那个节点(一般是headContext),这样就不会真正执行这个操作。。。对于channelRead等事件处理方法,他是netty自动发送的的,由内到外,他是执行一个handler都执行一次事件处理。
BootStrap.connect
BootStrap.doResolveAndConnect
AbstractBootStrap.init