在上一篇文章《揭秘ServerBootstrap神秘面纱(服务端ServerBootstrap)》中我们提出了这些问题,有点还没有解答,这篇文章专门对它们进行解答。
- 服务端openServerSocketChannel()和客户端openSocketChannel()的区别?
- 服务端newSafe()和客户端newSafe()有什么不一样?
- 服务端Channel的传入参数是OP_ACCEPT,客户端是OP_READ。
- EventLoopGroup和EventLoop之间的关系是什么?
- 到底什么是多路复用?
- 什么是reactor模式?
- redis 是reactor单线程模式?
- reactor模式有三种,我们现在的demo用的是主从模式,还是多线程
- bossGroup和workGroup分别是在哪关联的
- ServerBootstrapAcceptor的作用?
- childLoop如何绑定请求过来的channel
- 我们知道selector轮询服务端是轮询的,客户端轮询吗?
- 服务端特有参数:
childHandler / childOption / childAttr 方法(只有服务端ServerBootstrap才有child类型的方法)。
——对于服务端而言,有两种通道需要处理, 一种是ServerSocketChannel:用于处理用户连接的accept操作, 另一种是SocketChannel,表示对应客户端连接。而对于客户端,一般都只有一种channel,也就是SocketChannel。客户端和服务端使用的都是NioEventLoop吗?服务端workGroup中的EventLoop是可以绑定客户端来的Channel,那客户端的EventLoop是用来干啥的? - 三种reactor模型的区别:
单线程:acceptor和nio共用一个线程
多线程:acceptor是单个线程,nio是一个线程池
主从:acceptor是线程池,nio也是线程池 - selector的for循环部分,是我们所说的select、epoll中的select模式的代码实现吗?
目录
一、 服务端openServerSocketChannel()和客户端openSocketChannel()的区别?
二、服务端newSafe()和客户端newSafe()有什么不一样?
三、服务端Channel的传入参数是OP_ACCEPT,客户端是OP_READ。
四、EventLoopGroup和EventLoop之间的关系是什么?
八、reactor模式有三种,我们现在的demo用的是主从模式,还是多线程?
九、bossGroup和workGroup分别是在哪和channel关联的
十二、我们知道selector轮询服务端是轮询的,客户端轮询吗?
十五、selector的for循环部分,是我们所说的select、epoll中的select模式的代码实现吗?
一、 服务端openServerSocketChannel()和客户端openSocketChannel()的区别?
openSocketChannel()最终创建的是SocketChannelImpl对象:
openServerSocketChannel()最终创建的是ServerSocketChannelImpl对象:
总结:openSocketChannel()和openServerSocketChannel(),不同之处也很简单,就是两者创建的对象不一样,openSocketChannel()最终创建的是SocketChannelImpl对象,openServerSocketChannel()最终创建的是ServerSocketChannelImpl对象。
二、服务端newSafe()和客户端newSafe()有什么不一样?
不同之处在上面文章中其实有所讲解,将内容截下来了:
三、服务端Channel的传入参数是OP_ACCEPT,客户端是OP_READ。
结论就是标题。
四、EventLoopGroup和EventLoop之间的关系是什么?
EventLoopGroup 是一组 EventLoop 的抽象,一个 EventLoopGroup 当中会包含一个或多个 EventLoop,EventLoopGroup 提供 next 接口,可以从一组 EventLoop 里面按照一定规则获取其中一个 EventLoop 来处理任务。
五、到底什么是多路复用?
.I/O复用模型:
1.select/poll
老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。
耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次
2.epoll
老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。
耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话
详细请参考:I/O多路复用是什么意思?
六、什么是reactor模式?
Reactor 模式
是一种为处理服务请求并发,提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序
(来自维基百科:https://zh.wikipedia.org/wiki/反应器模式)
常见的reactor模式有以下三种
- 单线程reactor
- 多线程reactor
- 主从reactor
详细请看下列两篇文章:
Netty源码死磕一(netty线程模型及EventLoop机制)
七、redis 是reactor单线程模式?
八、reactor模式有三种,我们现在的demo用的是主从模式,还是多线程?
我们demo中使用的是主从模式,因为我们设置了bossGroup和workGroup,设置了这两个则是使用主从模式。
九、bossGroup和workGroup分别是在哪和channel关联的
bossGroup负责连接,workGroup负责处理I/O请求;
bossGroup与channel关联:
workGroup与channel关联:
十、ServerBootstrapAcceptor的作用?
在ServerBootstrapAcceptor中重写了channelRead()方法。如上面第九条,它就是用来将workerGroup绑定channel的。
十一、childLoop如何绑定请求过来的channel
这里有一篇关于“Netty新连接接入”接入的文章:http://www.bubuko.com/infodetail-2697108.html
十二、我们知道selector轮询服务端是轮询的,客户端轮询吗?
客户端demo以及追踪源码目前来看是没有select()的,另外select()这个方法不是一直轮询的,而是阻塞方法。
select不是轮询。只是有数据时,会依次处理有数据的fd。没有数据的fd不被处理。
十三、服务端特有参数:
childHandler / childOption / childAttr 方法(只有服务端ServerBootstrap才有child类型的方法)。
——对于服务端而言,有两种通道需要处理, 一种是ServerSocketChannel:用于处理用户连接的accept操作, 另一种是SocketChannel,表示对应客户端连接。而对于客户端,一般都只有一种channel,也就是SocketChannel。客户端和服务端使用的都是NioEventLoop吗?服务端workGroup中的EventLoop是可以绑定客户端来的Channel,那客户端的EventLoop是用来干啥的?
十四、三种reactor模型的区别:
单线程:acceptor和nio共用一个线程
多线程:acceptor是单个线程,nio是一个线程池
主从:acceptor是线程池,nio也是线程池
十五、selector的for循环部分,是我们所说的select、epoll中的select模式的代码实现吗?
https://www.cnblogs.com/cbam/p/11816453.html
https://blog.csdn.net/lsgqjh/article/details/86622532