备忘
netty是如何实现对于某个channel的IO事件,交由同一个线程去处理?
channel持有一个eventloop,后续所有的操作都会交由这个eventllop操作,具体是在每个操作前,判断一下当前的执行线程是不是eventloop,如果是,直接执行,如果不是,则将要执行的事情放到eventloop的执行任务队列中什么时候创建的多个NioServerSocketChannel?(与问题5类似)
netty中, nioServerSocketChannel只是在bind的时候被创建一次,后续也不会创建,但可以通过register方法创建相应的channel.
- NIO的标准操作哪里去了?
- NioEventLoop中实现了轮询的逻辑
- NioServerSocketChannel构造函数中实现了channel的配置信息
- Register方法实现了注册
selector是在哪里开始监听事件的,它的interseteOps是在哪里被设置的(如何监听连接,与问题6类似)?
bind操作中触发了fireChannelActive事件,这个事件会调用channel的read方法,然后会调用unsafe的doBeginRead方法,在这个方法中,channel的兴趣事件被真正设置, 而channel的interestOps在它的构造函数中就已经被设置好了SocketChannel是怎么被创建的(它是有多个吗?还是只有一个?)
socketChannel是在客户端发起连接操作时,由NioEventLoop的轮询操作捕获到相应的IO事件,它调用了unsafe的read方法,在该方法中,NioSocketChannel被创建,且通过NioServerSocketChannel的read事件传播, 在NioSSC的pipeline初始化的时候,设置了ServerBootstrapAcceptor的处理器,它会处理channelRead事件,并在这个事件的处理中,初始化NioSC的相应属性, 然后将NioSC注册到childGroup中. 对于每一个新的连接,服务端都会创建一个新的请求.server端是如何处理连接的
见问题5