00:02
各位上硅谷的朋友们大家好,欢迎继续收看上硅谷Java n IO课程,咱们继续完成刚才的select代码编写,刚才呢,我们通过过程把客户端代码已经完成了,那下面呢,我们写一下里边这个服务端的代码,把这个代码我们来做一下,那同样我在里边呢,也是创建一个方法,这方法我们起个名字,比如说我叫这个server。DEMO,咱们把方法做创建。然后创建之后,我在里边把咱们服务端代码的过程先写一下,然后咱们通过过程完成里边的代码,那里边我来做一下啊,首先里边的第一步大家说怎么做,咱是不是也是先获取到服务端这个通道啊,这是第一部分获取服务端这个通道,这个通道咱可以用我们之前说的对象叫server socket channel来做到,这是里边的第一步。
01:05
然后这个做到之后,咱的第二部分还是切换它成为一个就是。非阻塞的这么一个状态,就是做一个这么一个切换,那我写一下啊,就是切换它为一个非阻塞的这种模式,这是里边的第二部分,为什么变成非阻塞,之前提到过啊,里边这个特点,因为这就是非阻塞select才能进行这么一个注册这个过程。然后里面的第三部,那咱们还是创建这么一个buffer,给buffer分配它的大小,分配之后我们的第四部分在里边,咱要绑定我们这个端口号,做到这个监听的过程,然后下一步就是我们的第五步,当绑完监定端口号之后,下一步呢,咱肯定要获取到我们这个select这个选择器。把这个咱要获取到,然后获取之后各位说啊,第六步咱要干什么。
02:02
你注意我们目前有选择器了,有通道了,那我现在这个通道是不是要注册到咱们的选择器上面呀,然后这里边并且进行我们这个就是。监听,比如咱注后我们现在是一个就是连接就绪状态,还是说什么读状态还是写状态,还是接收状态,我们要做一个注册,然后注册之后我们里边的最后一步就是咱们之前讲到的,那这个时候我们用选择器是不是要进行这么一个轮巡的这个操作呀,就是轮询过程,看一下哪些通道里边已经是一个就绪状态,那我们再进行是不是后续这个操作啊,就做一个临群,然后进行我们的后续的这个操作,所以这个过程就是咱们编写服务端代码一个流程,那下面呢,我们就按照这个流程把代码我们来快速写一下,要求各位要知道里边这个代码的编写过程,那下面我们来做一下啊。
03:08
首先里边的第一步操作,因为咱是在服务端嘛,所以我在里边的用这个对象叫这个server socket channel。我们起个名字就叫server socket channel,然后它等于这个server socket channel.open方法,现在再来获取到我们这个服务端的通道,这是里边的第一步。有异场给他直接字数就出去。然后这个做到之后,第二步呢,咱做一个非阻塞模式的切换,用socket channel里面这个方法叫做config block。改成false,这样的话,这个模式我们就完成了这么一个切换,这是里边的第二步。然后这个做到之后呢,第三步呢,咱们也是创建一个buffer,然后写一下啊,用这个BA buffer。
04:06
如为了明显啊,给改个名字,这个buff。我们等于这个BA buffer里边那个locate里边,我们加上一个1024,就是分配一个buffer,这是咱的第三步,然后这个做完之后,下面呢,咱们在这个channel里边。给它绑定这么一个端口号,做这么一个绑定,那我写一下啊,用这个server socket里边这个叫band的方法,然后里边上这个对价绑定端口号,咱们刚才客户端写的是8080所,这里边对应它写上8080的端口号,这是我们的第四步操作绑定端口号,然后这个选完之后呢,大家注意啊,咱们从下面代码开始就要写到咱们选择器的部分了,也就是咱们这个知识点中核心的部分,那咱看第五步,第五步呢,我就要获取到这个选择,那通过这个对象里边这个方法叫做方法,咱们来获取到我们这个选择,我们就叫这个。
05:19
把这个给它写出来。这是咱的第五步,然后选择器做完之后呢,下一步操作大家注意啊,因为现在通道有了,选择器也有了,那咱把通道在选择中是不是要进行注册呀,所以我调用这个serveet通道里面这个叫方法进行注册,第一个就是你那个选择器,第二个是你就是感兴趣里边那个事情,就是你操作的一个状态。那这个状态呢,我们来注册一个啊,我用这个。K里边的这个相关这个常量值,比如咱用这个叫accept,就是它一个接收就绪的状态,在里边我们做监听,监听通道里边是否是一个接收就绪的状态,所以现在咱们把这个过程完成了,然后这个完成之后,我们的第七步,也是最后一步,我们要在起测器中进行轮询,看一下它是否是这个状态,如果是的话,那我们再进行我们后续操作,所以最后一步我们就通过这个sta进行轮巡的这个操作,那下面给各位来写一下啊,首先在里边呢,我来个这个while循环。
06:34
然后while循环中我们写什么呢?大家注意啊,在里边有个方法叫select方法,咱之前提到过这个方法,如果它的值是一,那就表示是不是已经是一个就绪状态,所以咱们给他判断,如果它大于零,那么后面做处理,但因为我现在在一个选择器中是可能有很多通道,而很多通道中可能这个就绪,可能这个没有绪,可能它都可能就绪了,所以这个时候咱可以通过这么一个就是集合形式得到里边所有就绪那个相关的那个状态,咱们之前写过这个代码,那这里边给各位写下啊,用这个select里边这个方法叫做selected case。
07:17
他就得到咱们这个赛这个集合,然后得到集合之后,下面的咱们把它做一个便利,得到里边所有那个就绪状态那个操作,我们进行这么一个便利,也是咱们之前提到的啊,我在里边写一下。然后这个便利呢,我们就写一个这个。好,我就直接写上这个啊,叫selection。点上这个得到咱们这个就是这个对象,那这里我给它起个名字,比如叫这个selection,这个key is啊,咱们就叫这个名字。
08:00
然后这个写完之后,下面呢,咱们从这里边是不是取到你那个就绪那个操作呀,然后咱们再做后续的这个处理,那下面我们来写一下啊,在这里边咱们继续写上一个while。然后在while里边呢,我们用这个叫selection key,点上这个方法,应该叫这个就是哈西nice方法,判断是不是有下一个元素,如果有的话,那我们从里边把这值给它取出来,Selection kiss it点上这个nice方法,取到里的每个这个select,把这个就汇到你那个就那个。状态或者就绪那个操作,我加个注释啊,就是获取到我们这个就是已经就绪的那个操作是什么,也就是里边那个nice,就是那个操作,然后这个做到之后,下面咱就做个判断。
09:02
就是判断一下你是什么操作,或者何种类型操作,再做后续处理,那这里边我们来判断一下啊,首先我判断第一个。咱们在里边的用这个nice里边这个方法,比如咱们判断先这个就这个access able是不是一个接收就绪状态,如果接收就绪状态,那咱往后坐,这里边我可以再来一个叫else if。再做个判断。比如说啊,它里边是否是一个这么一个。可读的一个状态,那咱来判断叫意思read的able啊,这是我们的两判断,这是是否接就是就绪接收的这么一个状态,这是是否就绪是一个读的一个状态,所以现在我们写了这么一个判断的一个代码结构,然后写完之后在里边写的具体代码,因为咱们现在啊,就是。注册监听的是不是一个接收的这个就绪状态,所以我在里边怎么做呢,写一下啊首先。
10:07
先获取到你那个连接。获取连接之后还是切换到这么一个非阻塞的模式,然后切换之后继续进行这么一个就是选择器的一个注册。注册之后啊,咱们可以给他,比如做成后续的这些处理啊,所以后面我们做的是这么一个过程,那下面咱们就是进一步来写下这个代码。也就是说呢,各位可以这么理解啊,我客户端发送过来这个信息,然后这里面告诉他已经是一个接收就绪状态,那咱们得到那个连接,再进行后续的操作,那这里边我来写一下啊,首先因为咱们用的是这个叫socket channel。我起个名字啊,就叫这个accept啊,这个名字,然后等于这个socket channel,点上这个就是里边这个方法,我们看一下啊,啊应该不是是这个上面那个server啊,通过它来得到我们这个连接,就是点上一个叫a accept方法接收到把这个对象得到就是socket channel。
11:17
然后得到之后,咱们做一个非阻塞模式的切换,这个值改成叫false,然后这个阻导之后把咱们新获取这个就是连接或者这个channel注册到咱们的选择器中,那这里边我做注册用这个。第一个就是我们这个选择器,然后第二个是里边那个就是就绪的状态啊,咱们来一个section k点上就是用这个read,这个状态就是这个是否读就绪状态,所以现在把这个做出判断,然后判断之后咱们再读里边就可以把里面的数据给它最终取出来就可以了,那这段代什么,我从课件中给各位就直接拿过来啊,咱来看一下。
12:04
也就是里边的这个代码。我把这个啊给各位直接分过来。就这个代码。咱们拿到这里边啊,给它稍微改一下啊,因为我们写的名字跟我课件中的名字有点区别,但是结构应该类似的,那下面咱给它快速改出来这个过程。那我们来写一下啊,首先如果它是一个读就绪状态,那咱通过这个N。把里面这个channel给它得到啊,这个我们改个名字,比如就叫这个channel,然后得到channel之后,下面咱们也是通过缓冲区进行操作,那这里边呢,比如说我这个位置,我创建一个缓冲区,我把这个啊拿过来,咱改一下,就这位置咱们再来一个缓冲区。然后画中区给它改个名字啊,就叫这个BA buffer,然后这个做到之后,下面咱就来做这个就是数据一个读取。
13:03
把数据给它读出来,那怎么读呢?有多种方式啊,就你直接追的就可以,但这个方法给各位写的就是更完整点啊,咱们给它进一步写一下,首先在里边我这里边来一个Y啊,就是循环。然后循环里边咱做个判断啊,就是里边这个channel。点上这个read。加上咱们的字节数度就是这个值,如果说它大于零,那我们继续往下进行读取啊,这里边咱给他来一个变量啊,我们叫这个Les。等于这个零,然后这里边啊,我进一步写下,呃,给它加到一个括号中啊,就是这个Les。等于这个值,如果说这个值呢,它这里边大于零,那我们在进一步往后做一下这个处理啊,里边就是这么一个过程。
14:00
然后这里边,呃,应该不是reject啊,应该是read的方法啊,这里写错了啊,就read,如果它是大于零,那我们进一步处理一下,咱们用这个。八块先做一个模式的一个切换,切换之后我们把它的值直接给它输出一下啊,那我们就直接输出一下啊,我们就扭上这么一个。坠了啊坠。然后在此里边我们用这个就是by buffer,点上这个就是瑞啊,用它来读一下啊,然后从这个零到这个N,就是把它值都给它最终读出来啊,就写上这么一个基本结构。把八份呢,输出之后,最后呢,我们做上这么一个课令啊,所以现在这个过程就完成了,然后完成之后,最后别忘记啊,把咱们辨认之后那个也就是这个啊selection key做这么一个。那我们来最后做一下啊,应该是写到咱们的。
15:03
这个位置我找到这个里边啊,应该是在这里啊。咱们加上这么一个remove,所以现在呢,我们这个代码就最终完成了,就是完成了我们就终这个服务端代码,那这个代码我们再看一遍啊,最终我们来做个测试。咱们再看一下这个过程我们是怎么做到的啊,给大家来说一下啊。首先第一步呢,获取咱们服务端的通道server,搜给China,第二个切换模式,第三个buffer,呃,其实这个buffer我们暂时应该没用到,然后后面又建了一个啊,但是用上面这个也可以,第四步就是绑定端口号,第五步获取选择器,然后咱们在选择器中注册通道,并且进行监听,监听之后咱们进行轮询,然后做咱们后续的这个处理,所以刚才咱们通过这个代码把这个就是选择器的过程,我们就做了一个实现,所以各位要知道里面这个实现的这么一个流程,这个我们就最终做到了。
16:07
然后代码完成之后呢,下面呢,我们来做一个测试,看一下它最终的效果是怎么样的,那我们来试一下啊,首先我把服务端我们先启动起来。咱们做个启动,因为服务端它要一直做这个,就是相关这个操作啊监听,然后咱们把客户端这里边也做个启动,这里边我也启动起来。然后咱们看里边这个过程啊,首先大家看服务端中这里边啊,我们应该就得到这个数据,就是我们当前这个时间嘛,这个得到了,因为这是我直接你看啊,刚才我在过程中向八个中写入的是不是就是你的当前的时间,所以他现在就把这个当前时间这个值我们就得到了,也就是里边的这个啊,当然因为这里边呢,如果说你想不断得到,你可以加上这么一个while循环加个处,把它一直得到,我这里边应该就得到一次,当然你可以不断给他得到啊,做个循环判断,我这里边现在这值得到了,就是这个客户端你发送服务端得到了当前的这个时间。
17:12
所以这就是咱们完成的一个关于这个select,这个完成代码,分别它的客户端和服务端代码,咱们都做了一个实现,所以咱们到这里为止,就把这个select选择器的部分给各位,就最终说完了,要求各位重点掌握这么几点,第一点你知道select它是什么,有什么特点,然后第二个它的使用方式,还有第三个我们写这个示例代码,通过示例代码让各位就是更好去理解一下letter及其他相关的特点,所以这个部分我们就演示完成了。
我来说两句