- 1.首先客户端将我们的NioSocketChannel当成一个属性注册到多路复用器selector上,得到的
SelectionKey(其是代表当前 channel与该selector之间的一个token,我们在上面可以注册多个事件,每次有就绪事件我们就会按照顺序处理四个不同的事件)
- 2.当我们进行connect的时候会在连接未完成的情况下注册一个connect事件(因为connect是一个异步事件,每次注册不一定立马成功。我猜测只要注册connect事件就会有就绪事件发生)。
- 3.我们从我们的就绪的SelectionKey获取attachment(也就是1中的属性),如果其是AbstractNioChannel代表这是我们注册的四个事件中的一个就绪事件。
- 4.如果我们顺利的执行连接操作并立马连接成功则我们只需要设置promise并激活通道即可(激活通道会注册read事件)。
- 5.如果不是立马连接成功我们会注册一个定时任务,当这个定时执行的时候代表connect操作还未处理完成(即既没有连接成功也没有发生异常)则执行超时相关代码。
- 6.同时增加一个监听,这个监听是防止我们这次的连接事件任务被取消了 那么就有可能出现我们的超时任务没被取消
进而出现超时异常。 - 7.当我们的selector捕捉到connect事件然后处理我们的connect事件,处理之前先取消之前注册的connect事件(
如果不取消会导致Selector.select(..)操作不会阻塞直接返回,进而造成cpu空转
),紧接着调用unsafe.finishConnect();该方法其主要是进行连接操作,不论操作成功还是失败 都会执行相应的操作(主要是设置promise),在执行结束之后如果定时任务还有,则直接cancel(因为这个时候不属于超时,要么是成功要么是连接异常)。
Netty客户端是如何处理连接(Connect)事件
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...