Netty客户端是如何处理连接(Connect)事件

  • 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)事件)