Netty3 源码分析 - NIO server接受连接请求过程分析
当服务器端的server Channel绑定某个端口之后,就可以处理来自客户端的连接请求,而且在构建
NioServerSocketChannelFactory 的时候已经生成了对应的
BossPool 和
WorkerPool,前者管理的
NioServerBoss 就是专门用来接受客户端连接的Selector封装,当,下面是关键的代码:
1.
AbstractNioSelector中的run方法代表这个boss thread的核心工作。
public
void
run() {
thread
= Thread. currentThread();
// 打开闭锁;
startupLatch
.countDown();
int
selectReturnsImmediately = 0;
Selector selector =
this
.
selector
;
if
(selector ==
null
) {
return
;
}
// use 80% of the timeout for measure
final
long
minSelectTimeout = SelectorUtil.
SELECT_TIMEOUT_NANOS
* 80 / 100;
boolean
wakenupFromLoop =
false
;
for
(;;) {
wakenUp
.set(
false
);
try
{
long
beforeSelect = System. nanoTime();
// 返回有多少个Channel准备好了
int
selected = select(selector);
if
(SelectorUtil.
EPOLL_BUG_WORKAROUND
&& selected == 0 && !wakenupFromLoop && !
wakenUp
.get()) {
//上述select阻塞的时间;
long
timeBlocked = System. nanoTime() - beforeSelect;
//如果小于最小超时时间限制;
if
(timeBlocked < minSelectTimeout) {
boolean
notConnected =
false
;
// loop over all keys as the selector may was unblocked because of a closed channel
for
(SelectionKey key: selector.keys()) {
SelectableChannel ch = key.channel();
try
{
if
(ch
instanceof
DatagramChannel && !ch.isOpen() ||
ch
instanceof
SocketChannel && !((SocketChannel) ch).isConnected()) {
notConnected =