00:00
从前面的分析呢,我们发现。Select里面有个特别重要的组件就是selection k,那现在呢,我们再看。NIO非主色网络编程的一个原理就是select selection k,还有server socket China和China的关系一个梳理,然后呢,我总结几句话,这个图很重要哈。这个图呢,因为。呃,内容太多了,所以说我就不再手画了,我直接把这个图拿过来,然后呢,我对他说几说几点,来我们看一下这个图。我把这个图呢,直接就放在我们的幻灯片。往这儿放哈。呃,往这放过后呢,我们来整理几句话。我把要整理的内容就放到这边来。好,同学们,跟上我的思路。那同学们看这边这个图,怎么去说这个事呢?
01:02
那我对对右图的右图的一个说明。好,我们来看一下第一点,嗯,同学们看到这个图啊,这个图就是现在这个右边这个图你怎么去看呢?就是我们这个S实例。这个select首先它可以注册很多的这一个呃通道,那这个通道它是怎么注册到,怎么注册上的呢?大家看我这边,我把这个再稍微放大一点。我这边呢,在服务器这边首先会有一个server socket channel,前面已经说了,也就是说server soet channeler呢,它实际上是,呃,其实相当于说它在服务器这头进行一个监听,当有客户端连接的时候呢,它就产生一个so China,然后把这个soer chinaer注册到S上面去,说是这个流程是这样子的。啊注意听,当客户端连接时,连接时OK会生成会通过这样写,会通过把这个字体放小一点。
02:11
啊,来个是大家能看清楚的就可以了,好吧,14会通过我们的。Server。Server socket channel,因为这个理论东西你不理解啊,待会你看起来实际上很郁闷的,通过server socket channel创建或者得到都可以啊,得到吧,得到。得到对应的就是跟这个对应的socket socket China没有问题吧,好的第二步,第二步呢,因为在这个过程中,他会把得到这个ET turner呢放到这个select里面去,但是呃,Select这个select呢,实验已经创建好了。啊,所以说将什么呢?将这个呃,得到的,将这个server,呃,Shocked shocked China。
03:03
注册到注册到哪里去呢?Select上。那问题又来了,说老师你能给我们看一下它是通过哪个方法来做的吗?来给大家看一下源码。同学们看,现在我们找一下select啊,现在应该找哪个呢?是应该找so China。跟上我的思路哈。So China,好,同学们看socket China有有这个register方法,没有找它的负类。Abstract able channel进去。在这边我们看有没有方法也没有,哎,看这已经找到一个了。大家看这里面是不是有个register。是不是看到这个register吧,这个register方法是干什么呢?传入一个select,然后再传入一个option,其实还有除了这个方法之外呢,它上面应该还有一个方法。
04:03
这这个方法也可以用,我们再找一个,再找负类,再往上负类上再找一下啊。再再找一下叫select selectable channel。上面还有一个register这个方法用的比较多啊,我一般会用这个方法就是register方法,这个register方法里面呢,它首先第一个填的事就是select,就是你你要把当前的你这样理解哈,你要把当前的这个channel注册到哪一个里面去。注意这个select是可以注册多个通道的,然后OS呢是指的他关注的是什么事件。待会我们会再看这个东西,也是通过这个方法。可以把它注册到我们的指定的去。具体来说,就这个方法。好的。明白啊,接着我们继续往下分析,那么这个注册以后,注册以后它会返回一个selection k啊注册后。
05:09
注册后返回一个什么玩意呢?返回一个select k。好,注意我再我再多说一句,一个select上面可以注册多个channel,明白这意思吧,加进去吧,就是一个select。上。可以注册多个传呃,多个这个通呃,多个这个socket。Socket channel这个一定要搞清楚,那么它每注册一次呢,它会返回一个select select k,这个K呢,就会被select select,呃,被这个select管理起来,做成一个集合的形式管理起来,注意听啊。这个然后会干什么呢?会放入会背。会和该这样写吧,会和该select关联。
06:03
那么它是以什么方式关联呢?集合的方式啊,就说你这个select k呢,就被我这个select用一个集合管理起来了,理理解这意思吧,好的。紧接着呢,我们再来看,嗯,因为你这个server一键呢,产生一个,那下面这个select呢,它就可以进行监听。哦,S就可以进行这个监听。Okay。呃,监听或者监控都行,他用的方法呢,就是select方法。好,下列方法。这个select这个方法,这个这个方法会干什么呢?这个方法它会返回当前他管理的通道,有哪些通道发生事情呢?哪些通道发生事情,那么事情呢,主要有四种,一种呢,就是我们我们来简单看一下啊呃,我大都说,呃把这写完再说,建立会返回,返回他返回有事件,有事件就写错了。
07:07
有。事件。那有事件发生的,他关心的事件啊,有事件发生的通道。通道的个数。个数。OK。啊,这个地方你可以用主色的,也可以用非阻塞的。那问题来了,说老师,那我得到这个有事件发生的,呃,有事件发生的通道,呃,通道过后,我我要去抄这个通道又怎么办呢?好,这个地方selection就很关键了,因为它注册过后会返回一个selection k,而这个K,而而这个selection k呢,它有些特别重要的东西,我们来看一下。好,我们往这边追哈。同学们可以看到在这一个3K里面呢,它有这么几个事件,就是在注册的时候它可以指定就是呃,同学们看到我不是在这讲了一个OS没有说吗?这个OPS可以传入的值其实就是这么几个值,一个是RA的事件。
08:09
就是我这个通道有RA的事件发生了,这个right事件,这right呢就是有血事件发生了,还有一个呢,就是connect,呃,Connection connect事件,这个就是代表连连接,呃,成立了,建建成了这个事件,还有一个事件就是accept,就是有一个新的连接来了。这个accept就说有一个客户端来连接我了们了,明白这个意思吧。这个是代表连接已经创建好了,这个是代表我们这个通道发生了一个血血的事件,这个代表我们发生了毒的事件。所以他这里面呢,其实是你在注册的时候是可以告诉,呃,告诉这个sector,我这个通道关注的是什么事情。啊,就这个意思,就这个意思明白了哈,好,那现在他这个select进行监听,返回的是由事件发生的通道个数过后呢,下面第五步再可以干什么呢。
09:05
然后他一旦拿到了这个,这个事件过后就可以得到啊,可以再次进而。再次,再次。进一步啊,进一步得到什么呢?得到各个什么呀,同学们这个东西。也就是说你只要这个select一旦返回它,而且不呃这个select返回的个数只要是大于大于零的情况下呢,我可以再通过这个select得到他管理的现在有事件发生的这个呃通道的select k明白了吧。进而得到各个注意。这边是得到有事件发生的。有四件。发生的。发生的,因为一所以说我在刚才呃不是讲过吗?你可以认为这个sal k就是跟我们一个so China关联起来的啊,然后下一步又可以干什么呢?再通过注意听啊,再通过我们这个sal select k可以反向获取。
10:14
反向获取。获取骂呢,反向获取我们注册的这个socket channel。能理解吧,周老师他是怎么得到的呢?来前面不是讲过了吗?我们这个select k里面有个非常重要的方法就是channel,你看它返回的就是set channel。好,OK,其实,呃,其实就是得到你注册的那个channel,明白了吧,他通过这个方法来得到的。理解了好,那下一步自然顺理成章,我们就可以。可以通过这个获取的这个参啊,通过得到的参完成相应的事件得到。得到的这个channel。对吧,Channel这个channel其实就是是少少给channel啊,反新获取这个方法是。
11:08
然后再通过得得到签的完成读写或者什么任务,完成业务处理。好的同学们,大家现在是不是大致,呃,对对,这个select select k server socket channel。Short channel的关系要比刚才要再清晰一点了,只是呢,现在我们差一点什么东西支撑呢?就是差一点代码支撑,代码撑腰啊,代码撑腰后面有写。撑腰。代码成幺,我一会儿就会写代码了,把这个代码在一起,你再回头再来理解,诶就更加清晰了,好吧,这个图呢,其实是非常有,嗯,非常有指导意义的,你看再看一下我这边server socket会产server soet,一旦连接成功就会跟就会创建一个soet channel和我们客户端进行通讯,但是呃,因为我们这个NIO呢,它是一种,呃,这个同步非主塞的,它怎么做到呢?他就把这些,把这些那channel注册到他这个选择器上面去,这个选择器呢。
12:17
它是不停的在这里呃进行这个监听的,而且它是以一种什么呢,非主摄的,非主摄就select这个非主摄的形式,或者说我可以指定阻射多少秒,而不是一直在这阻塞的方式来进行监听,监听的时候呢,一旦你这个通道里面发生一个什么事件,好,我这个时候呢,就能得到,呃,原先你注册的时候的这一个SK,再然后再通过这个SK呢,反向获取我们这个channel,然后再进行什么样业务处理。Okay。好,这就是他们一个重要的关系,如果把这个关系理清楚过后呢,咱们后边相对来说要容易一点,而且面试官问的时候呢,你应该也回答的比较到位好了,那关于这个原理分析我们就到位到这里,然后呢,下面呢,就是代码撑腰部分,好休息一下。
我来说两句