Netty源码分析之accept

本文解析了Netty中客户端新连接请求的处理流程。从NioServerBoss接收到请求开始,通过selector监听socket事件,接受新连接并注册到NioWorker。详细介绍了如何在循环中接受连接、创建channel及后续的事件注册过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

处理客户端新连接请求的方法从org.jboss.netty.channel.socket.nio.AbstractNioSelector.run()开始分析。

NioServerBoss是AbstractNioSelector的子类,处理服务器端接收新请求的处理类selector。如果有多个selector,可以创建bosspool时设置多个selector实例,新的绑定地址bind任务将依次均匀的添加到各个boss任务队列中。详见“Netty源码分析之线程模型”。

回到AbstractNioSelector.run()方法,它主要以死循环的方式做了以下几件事情:
1.首先设置原子变量wakenUp为false
2.开始阻塞监听selector.select(),退出阻塞的原因可能是有socket事件select正常返回或者被其它线程主动唤醒(如有新的bind 注册任务时)。
3.退出阻塞后,首先运行任务队列中任务(新bind时的注册accept事件任务)。然后再在NioServerBoss的process中处理selector中各个Key。
4.对于每个selectionKey,依次通过socket.accept返回新的channel,向上行流发送OPEN事件,再把已连接channel注册到NioWorker(另一类selector)中。
for (Iterator<SelectionKey> i = selectedKeys.iterator(); i.hasNext();) {
SelectionKey k = i.next();
i.remove();
NioServerSocketChannel channel = (NioServerSocketChannel) k.attachment();

try {
// accept connections in a for loop until no new connection is ready
for (;;) {
SocketChannel acceptedSocket = channel.socket.accept();
if (acceptedSocket == null) {
break;
}
registerAcceptedChannel(channel, acceptedSocket, thread);
}
}


5.注册过程如同bind一样,创建注册任务并添加到下一个NioWorker的任务队列中,并唤醒对应处理阻塞中的selector。注册任务包括:向worker的selector注册read事件,成功后向上行流通道传递CONNECTED事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值