课件和 Demo 地址
https://gitee.com/geektime-geekbang/geek_netty
作者回复: 三种境界吧,一是能解决问题,二是解决问题之外还知道原理,三是不仅知道原理还能说出来且让别人容易理解,第三种值得努力研究。
作者回复: 因为默认有一点了解的,所以很多细节一带而过了。这里补充说明下: channel: 也就是连接; eventloop:为连接服务的执行器,说白了,就是一个死循环(loop)轮训、处理channel上发生的事件(event)。一个channel只会绑定到一个eventloop,但是一个eventloop一般服务于多个channel. eventloopgroup: 假设就一个eventloop服务于所有channel,肯定会有瓶颈,所以搞一个组,相当于多线程了。
作者回复: 是的,要有耐心,我打算课程结束,我也再从头到尾看一遍。哈哈
作者回复: 你说的太对了!hadoop的web hdfs http服务器就绑定了两个端口。不记得后面的课程有没有提,所以这里我直接告诉你这样的案例,谢谢
作者回复: 是的,没有用,判断有没有用的标准,就是看绑定的端口多少,像服务器,一般都绑定一个地址启动,比如8080,所以其他的的用不到,但是你绑定2个端口起启动就会用到了,比如一个绑定8080,一个绑定443.
作者回复: 其实应该一口气把七个工序都读了,可能就清晰多了,回头我也画张图,再给大家串串,然后到时候(更新完后我集中把所有问题都处理)做个常见问题小册子给你们。最近在做课程,很多问题没来得及回复,不好意思
作者回复: 后面有,在业务处理那块,如果到时候哪里不清楚,可以留言,谢谢。 这里可以简单说说:pipeline其实就像工厂的生产线,上面有很多道工序(channel handler),然后这个产线的开始就是接受到的原始数据,最终把产品加工,处理完,打包出去就结束了,本身还是很简单的,扩展性就在于这些工序可以随意定制,我们基于netty开发实际上就是写这些工序,然后有序组织起来。
作者回复: io.netty.channel.ChannelInitializer:里面在执行完后,有这样一句: pipeline.remove(this); 就是这句移除掉自己的。 private boolean initChannel(ChannelHandlerContext ctx) throws Exception { if (initMap.add(ctx)) { // Guard against re-entrance. try { initChannel((C) ctx.channel()); } catch (Throwable cause) { // Explicitly call exceptionCaught(...) as we removed the handler before calling initChannel(...). // We do so to prevent multiple calls to initChannel(...). exceptionCaught(ctx, cause); } finally { ChannelPipeline pipeline = ctx.pipeline(); if (pipeline.context(this) != null) { pipeline.remove(this); } } return true; } return false; }
作者回复: 不懂也没有关系,抓住主线和本质就行了,因为细节就算懂了,过段时间也忘记了,然后另外,如果ppt上的主线和本质不懂的话,那可能要补下相关的知识。加油!
作者回复: 1 因为所有的pipeline都是以head开始,以tail结束。所以演示的时候,我知道核心逻辑在head中,所以为了节省跳转时间,直接定位到最后了。 2 是的,启动后,就active了。 3 没有OP_ACTIVE,注册的是readInterestOp,如果是ServerSocketChannel,就是指OP_ACCEPT,也就是16. 4 16代表accept,表示开始监听连接请求的事件了。