00:01
Selection k,我们现在呢,再花一点时间把这个selection k给大家说一下。在前面呢,我们编程的时候已经涉及到son k这个概念,那这个S到底是什么呢?如果说我们说的具体一点,可以这样理解,Select k呢表示select就是我们选择器跟网络通道的一种注册关系。那同学们还记不记得我们在前面有这张图?这个图呢,为了方便哈,我直接把这个图呢,也放到我们的这个Excel里面来。同学们看。就是当我们。有一个有一个channel,不管是server channel还是我们的。Socket channel他都会注册到一个select上面去,那一旦被注册到select上面过后呢,就有select来进行一个管理,对吧,我们可以来证明一下这一点,来看一下同学们看我们在前面呢写的这个案例。
01:03
我们看这里。叫n IO server,我们可以在这里呢输出一句话,大家看这里server register注册到了这个sector那。到底这个呃,他注册完了过后生成的这个select key到底是放在哪个地方去了呢?同学们还呃,我们在前面是不是已经说过这个事儿了,大家看。在我们。Select里边去,我们追一下。啥事?对,然后呢,我们看一下它的继承关系。竞争关系里边呢,首先我们要知道select它本身是个抽象类,它下面呢,还有一个抽象的子类,然后下面真正实现select这个下面还有啊是这个window。我要走是window select implement,所以说我们先来看一下到底它的类型是什么,我们回到这来,我们来看一下这个select它的类型是什么。
02:07
好的,我们在这里下一个断点。运行一下。走起来,我们看到底它是哪一个类型是真实的,这个类型是哪一个。往下走,好的,我们执行下一步。所以下一步呢,我们看一下它的类型。定在这里。没出来是吧。在这儿可以看,大家看。从这里是不是就可以看到了?Select,真实的类型是Windows select。这点大家要非常的清晰,所以说实际是Windows select employment的一个实例,那第二点呢,我们再来证明下一点,哪一点呢,就是我们说过。当。一个channel注册到select过后呢,就会被这个select管理,那我们来看在哪里管理的呢?同学们看这里是不是他在这里面有个case。
03:10
哎,同学们看。这个case,这个case里实际上是以里面啊,这个case呢,里面就存放了我们的SK,我们可以把它取出来看一下,同学们看。在这里我们仍然把它取出来看一下,这里每注册一次呢,就会在。就会把这个select selection k加入到我们select一个属性里面去,我们怎么获取呢?这样获取就可以了。好,我们。我们这样写注册的。注册后。的这个select k的数量。我们把这个数量呢打出来。就是现在有几个select channel就是我们的通道。注册上了过后呢,就会生成对应的SK数量是等于多少,我们通过这个方法就可以拿到。
04:05
点它有个方法叫case,看到没有这个case,注意听,Case和select selected k这是有区别的,Case呢是代表所有注册到我们这个select上面的通道,呃,对应的selection k,而selected case呢,Case呢是代表当他进行监听的时候,有哪些他注注册到它上边的呃,Channel。有事件发生。对应的那些select k啊,有点绕,那么我们来晒一下。那同学们看到这儿。第一这个地方肯定不用想,肯定他会返回一个一对不对,好然然后呢,我们可以在这里面再输一个,同学们还记不记得在我代码里边呢,这有一段代码。当我们注册完了过后,我们进行一个Y循环,Y循环如果发现有客户端来连接,是不是我们又生成了socket China,并且呢,也注册到了这个select上面去,所以说我们可以在这里呢,再输出一句话。
05:14
诶,所以说它后面就会在这里呢,也会增加,当你连一个客户端,连上一个客户端过后,就会增加一个SK,因此它就应该从234这样开始增长。因为你前面这。已经注册了一个嘛,这边如果再看的话,就应该234以此类推,好这边我们是这样写,就客户端连接后,客户端连接后。连接后注册。注册到。注册到我们下,呃,注册到这个注册的这样行吧,注册的。3K的数量,好,同学们,现在呢,我们来进行一个。运行看一下是不是跟我们分析的一样来运行值。
06:00
好的运行运行起来过后呢,可以看到第一个就拿到了这个是。Server socket China注册到我们这个S上面去了,没问题吧,下面呢,我们用客户端来连一个。运行。好,当我们运行过后呢,同学们可以看到此时此刻增加了一个,就是客户端连接后注册的S呢,就变成二了,我们再运行一个。对,我再运行一个。这是我们第二个客户端,那第二个客户端来了过后呢,它的注册的3K呢,就变成了几呢,变成了三能理解吧。好,但是我要问同学们一个问题啊,当然我如果再运行可能变成四了。因为你又来了一个客户端连接到,呃,注册到我们这个s select上面去了,所以下面这个是四,而且大家可以看到每个12呢,它的哈希扣的是不一样的说明嗯,是独立的so China,明白吧,好。
07:00
我现在关闭一下,这边我都关闭了。有一点还要证明一下哈,就是同学们,我我再多说一句,就是刚才同学们看到的。呃,就这个东西。就是同学们在这我们说的这个case呢,是代表所有的,那你如果是这样访问的是代表多少呢?问大家点selected case。这个是代表什么?是代表你在监听的时候,他注册的这些通道里面有哪些通道发生事件了,所以说这两个值不是相同的啊,不是相同的,除非你在某一个时间,刚好它所有所有注册的通道都有时间,那才可能相同,但是这种这种可能性是极小的。我们也可以把这。把它打出来给大家看一下。比如说我们在这个地方不是处于一个监听吗?一旦它不等于零就进来了,不等于就进来了,这个地方是不是我们s ker拿到一个集合,我们在这呢?来输出一下。
08:04
就是大家要把它区分开来,知道吧,好,我写一个select k的数量是。就是有事件发生的这些,呃,通道对应的SK有几个呢?可以这样输出SK点,直接用个size就可以了。是不是因为它是一个set嘛,Set,我用set可以返回来,好这个时候。同学们可以看到他。呃,就跟我们。那个case返回的不是一样的了,来看一下。好,我同样运行之。好运行起来。运行起来,运行起来过后呢,同学们,我们再用端运行一下。好,我把这个打开,同学们看,此时此刻。注册的30K等于一,而这个地方。就是连接成功了过后,这个数量变成二了,但是我们这个select case是一,也就说你现在其实有有两个,但是只有一个我们关注到,我们再来起一个。
09:12
走起来,那我问同学们,我现在又起了一个C,那么我问大家这个值是什么?大家可以看到这个值变成三了,这个三还是一,为什么还是一啊,因为你在第二次呃呃,这个客户端连接的时候,只也只有这个第二个通道。产生了一个事件,所以说他这边还是一个一。明白这意思吧,就是这边就是我们所说的selection。这个值就selected k,它只是返回的有事件发生的这个select k的数量,好了,那关于这点呢,我们就聊到这里。紧接着我们再来看它一些相关的方法,好,这个说完哈,那么3K里面呢,呃,它有四个比较重要的属性,其实前面我们已经说了,只是呢,我们这用再把这个值说一下来打开看一下。
10:04
还在这来看。我们找一下他的。这些属性哈。那就到这上面去看。啊,这儿没有的话下上面看。那我看看是在哪里哈。这个地方哦,3K我们找错地方了。Select key。哦,没有看他。同学们看,这里面呢,有四个,呃,它可能发生的事件,分别是red。Right。Connect connect connect还有except分别值是多少呢?我们看一下它这里面是用一个位运算来表示的。read呢,就是一。向左位移零位,那就是就是一所RA的呢,其实它这个值其实就是,其实这个就是一。它不移动吗?这就对应的一,我这写的有第二个right呢,是一向右位啊向左位移两位,那这个就是四,就这个四好,这边呢就是八,这边就是16好的,明白这个意思哈,紧接着我们就继续往下看select k。
11:19
这个类或者说对象相关的方法有哪些呢?有这么几个,一个是select,可以得到与之相关的对象,还有一个select able channel,这个是得到与之关联的通道,没问题吧?还有一个attachment,前面我们也用过了,它可以得到与之关联的共享数据。就是我们前面用过。八份。还有一个方法呢,我多说一句,叫OPS,就说我们这边也可以设置或改变监听的事件,什么意思?同学们知道,对于一个SK里面呢,它是关联了一个他关注的事件。就是我们说的那四个事件中的一个,但是在某个情况下,如果你想改变他关注的事件,也是可以通过这个方法来进行修改的。比如说。
12:09
打个比方。我们还回到。回到我们。程序里面去,比如说同学们看。我我在进行这个readable的时候呢,不是我已经得到这个K了吗?这个K就是这个通道对应的SK,明白吧,那如果说我想改变他关注的事件,我可以这样来来进行修改点。哎,然后在这里面呢。我可以去改变,比如说他原先关注的是read事件,我现在呢,可以把它改成right。当然这些呢,要根据你的业务逻辑来进行修改,好,我这里就撤回去。继续。1ACCEPTABLE这个是代表是不是?可以accept的还有is readable是否可读,Is readable这些方法是不是在这里我们用过了,就说如果你这个事件是这么一个事件,我怎么去处理,如果事件是一个readable事件,我怎么去处理,如果是以readable是什么,这个事件我要怎么去处理?说这里面呢,要根据相关的方法来进行业务的处理。
13:20
好,同学们,那关于SK,我们就聊到这里。
我来说两句