netty
2023-02-14 20:38:02 6 举报
AI智能生成
netty
作者其他创作
大纲/内容
创建NioEventLoopGroup
没设置线程数为CPU的2倍吗,传了参数为自己设置的
children = new EventExecutor[nThreads];<br>创建一个数组
遍历数组,为每一个EventExecutor是设置LinkedBlockQueue<br><br>
final SelectorTuple selectorTuple = openSelector();<br> this.selector = selectorTuple.selector;<br>为每一个EventExecutor执行Selector.open
设置bootstrap属性
调用服务端方法,传入两个线程池<br>bootstrap.group(boosGroup, workerGroup)<br>
将bootstrap的group属性设置为boosGroup<br>
将bootstrap的childGroup属性设置为workerGroup
.channel(NioServerSocketChannel.class)
将ServerSocketChannel构造方法设置属性
.option(ChannelOption.SO_BACKLOG, 1024)
将这两个值放入map<br>options.put(option, value);
.childHandler
将childHandler属性赋值为一个ChannelInitialize<br>
bootstrap.bind(9000).sync();<br>绑定端口
initAndRegister();
init
反射出ServerSocketCHannel<br>
super(null, channel, SelectionKey.OP_ACCEPT);<br>将Accept事件保存<br>
pipeline = newChannelPipeline();<br>初始化一个pipeline,有一个head和一个tail
ch.configureBlocking(false);<br>将ServerSocketChannel设置为非阻塞
init(channel);<br>往piepline里面放ChannelInitializer<br>
往piepline里面添加ServerBootstrapAcceptor
ChannelFuture regFuture = config().group().register(channel);<br>将注册任务加入taskQueue
eventLoop.execute(new Runnable() {<br> @Override<br> public void run() {<br> register0(promise);<br> }<br> });<br>
addTask(task);<br>将注册任务添加到taskQueue
startThread();
doStartThread();
SingleThreadEventExecutor.this.run();
strategy = select(curDeadlineNanos);<br>在里面进行selector.select()
if (strategy > 0) {<br> processSelectedKeys();<br> }<br>processSelectedKey(SelectionKey k, AbstractNioChannel ch)<br>
ranTasks = runAllTasks();
执行taskQueue里面的任务
register0
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);<br>serverSocketChannel注册selector
pipeline.invokeHandlerAddedIfNeeded();
会回调ChannelInitializer
pipeline.fireChannelRegistered();
执行Handler<br>
doBind0(regFuture, channel, localAddress, promise);<br>绑定端口
channel.bind(localAddress, promise).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
(SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0<br>
int localRead = doReadMessages(readBuf);读信息
1.SocketChannel ch = SocketUtils.accept(javaChannel());<br>执行accept,获取socketChannel
2.如果获取的socketChannel是null,就创建一个新的SocketChannel
3.SelectionKey.OP_READ<br>SocketChannel将SelectKey设置为读<br>SocketChannel设置于非阻塞
pipeline.fireChannelRead(readBuf.get(i));<br>处理channel<br>
会调用ServerBootstrapAcceptor的channelRead()<br>
child.pipeline().addLast(childHandler);<br>初始化时候创建添加的new ChannelInitializer<br>
childGroup.register(child)
processSelectedKey(SelectionKey k, AbstractNioChannel ch)<br>走的AbstractNioByteChannel的read()<br>
0 条评论
下一页