00:00
好的,我再建一个文件。再建一个文件,不着急哈,叫ninety。Server handle handler,没吧,同学们,好的,首先呢,我跟他说第一步我们先要做这样一件工作,就是先要去继承一个什么呢?这样的一个视频,Adapter adapter什么呢?叫做China。喧闹。Inbound handler adapter,这个是一个什么呢?这个是一个入战的handle的一个适配器。适配器,那这里面有有很多方法,其实你可以这样理解,我在这写一句话啊,做一个说明。先做一个简单说明,就是我们自定义一个自定义。一个handler handler。需要继承。
01:02
继承a ninety。规定好的。规定好的某个某个handler。那也就是说这个handler speech其实不止这一个,还有很多,是不是还有很多,不是说只有这一个啊,那么这个时候呢,你的这个自定义的handler才会拥有相关相应的这些功能。这是这是我们这个自定义的。Handler handler才能啊,才能称之为称为一个handler。你不能说呃,你不能说我自己,呃,随便写一个类,它就是一个handle,就好像同学们学rus一样,是不是我们rus写一个action,也要去继承一个某一继承他规定好的一个action,我们才能够去称之为一个action,不是说你你自己写一个类,它就是一个handle了,不是的,为什么呢?因为这里面它规定了,它有很多规范,就这里面它有很多规范需要我们去遵守。
02:09
哪些规范呢?我们先来看一下。好,首先我们看到这里面呢,有这样一些方法。有些方法是需要我们去重写的,你比如说这个方法。对,你看China read这个方法是干什么的呢?我给大家写一下,这是这个方法是干什么呢?就是读取。读取数据的事件。哎,读取事件,因为换言之就是说这里我们可以读取客户端发送的骂呢消息。也就是当你呃,当当他发现有客户端消息发出来过后呢,他通过我们这一个PI pipe烂的一个调用,它会把这个呃客户端发送消息给你,传送到pipe none的pipe none关联的这一个呃handle来上,那这里面呢,有几个信息特别的重要,我又要说了。
03:14
拿这个信息呢,第一个就是同学们看到的他。听这个名字叫channel handler context的,它是干什么呢?它是上下文对象。呃,上。上下文对象。那这个对象里面包含了什么呢?包含了很多很多东西。它包含了哪些呢?它含有含有这样一些信息,比如说它含有呃,管道。就是说通过这个呢,我们其实可以拿到这个PI land。PIPE。还有什么呢?还有通道。比如还有通道,他也能拿到。说老师通道和管道有什么区别,都听懵了。
04:00
忍一下好不好,忍一下啊,管道和通道呢,其实他们有相同的地方,也有不同地方,这个管道呢,其实它更多的是说我这个管道里面可以关联很多的这个handler,然后呢,就好像一个水流一样,你的这个水流通过我这个管道啊,你你可以认为这这这是一个管道。在这个管道里面有很多handle,你这个水流在流动的时候呢,我有很多的这个handle的去进行这个处理。啊,通道更重,通道呢,更注重的是数据的一个,呃,读和写啊,他主要是做数据,准确的讲这是数据通道,而这个管道呢,你可以认为是业务逻辑处理管道啊,这样说可能会稍微清晰一点,就他还可以得到这个管道。啊,通道。好的,还可以得到什么呢?地址就是地址,他也可以得到,就是你连接的地址都可以拿到很多信息。好,那现在呢,我们再来看这个玩意是什么东西呢?同学们再看object object msg。
05:04
这个大家猜也猜到是什么呀,这个就是客户端,客户端发送的数据,呃,但是呢,它是以这个对象的形式,呃,给你给你拿过来的,你当然根据实际情况要做转换啊,它默认是默认是。默认是object的这种形式,那现在呢?呃,当有数据读取的时候,这个channel read就会被触发,那现在怎么办呢?好,同学们看我在这里呢,搜一下,我说server。我们看我们把待会我想把这个T,呃,TX给你们打出来看一下,我就写一个serve。Server txt等于我输到这里,待会呢,我们可以看它里面到底是什么好,然后呢,我们再来看下一步有一个重要的问题,大家都知道,嗯,NIO的这个模型呢,它是拿到这个数据以后,它是先把它放到一个缓冲里面是不是?
06:03
啊,也就是说你现在可以认为这个数据呢,现在在哪里呢,这个数据已经拿到了,我们需要。如如果说我们要进行这个处理的话呢,其实我们是需要把它转转成转到一个buffer里面去进行处理更好一些,所以说下面呢,我们这样做啊干什么呢,我将。将我们的MSG。MG转成。转成什么呢?转成一个bit。Buffer。By barber,那这个bit barber,同学们注意啊,这个bit barber呢,我先写,写完吧,大家可能现在不知道老师在说什么,By bye,好,Byt buffer。BUF。那我就写个八本等于MSG对吧,我转一下。嗯,转一下,就是我把MC转成一个bit baruffer,注意这个bit buffer呢,这个可是ni提供的,它跟NIONIO的bit barber是有区别的,注意听。
07:07
我这要说明啊,这个bad ber是什么呢?是na提供的。来提供的。提供的啊,不是,嗯,不是我们NIO的这个bit buffer IO的BBAB应该是要写的吧,我记得。Ber是这样写的吧,这两者它是有区别的,那么先简单理解一下这个bit buffer呢,它的性能其实更高的,它的性能更高。那就是他我们不是讲过吗?Ni其实是对NIO这一层的一个再包装,说它的性能更高一点,那拿到这个过后,下一步是不是我们就可以输出来了呀。好,我们现在把这个信息输出来一下,怎么输出呢?我们接着写客户端。够端发送消息是。我输一下。怎么说呢,大家都知道现在这是个这个是一个字节buffer,所以说你要把它转成一个字符串。
08:03
那我就写了点two俊。对吧,Two three呢,我们在转的时候按照UTF8-UT8来来进行这个转换,我就写一个character。Chat。嗯,Char set char set u这个工具这个类,这个类呢,我们指定是UTF8。比如说我们把它转成呃,UT8的这样一种一一种支付串,然后我们同时把客户端的地址打出来,客户端地址。客户端地址,刚才老师是不是讲过我们这个China hundred contacts包含了太多太多信息?大家只要只要想到要拿数据,要拿什么,嗯,对象你就想办法从这地方拿就行了,我看能不能拿到。点。Channel是不是我们可以拿到channel,拿到channel过后呢,再把它地址打出来。
09:00
好,这就是。读读,那读完了,同学们想一想,是不是我们还有一个回送消息给别人?对,也就是说。还是对照这个图。呃,就说你这个客户端呢,发送个信息到,不管怎么样,经过我的一系列的处理,最终呢,到了我这个关联的pipeline的一个handler,我读到了,读到读到这个数据,是不是我要想办法把这个数据给你发送回去。是吧?那么怎么把这个数据发送回去呢?它还有一个方法,就是可以去进行重写,叫做channel read。Complete。好的,那这里面呢,就代表我们这句话代表什么呢?就是读,就是读取读取。呃,数据数据读取完毕。啊,代码有点长啊玩具那读取完毕过后,是不是我就我把你数据读完了过后,我再给你回一个消息就可以了,那我怎么回一个消息呢?非常的简单,大家都知道。
10:04
我们这个是上下文对象,他肯定有很多方法,我把它点一个,其中有个方法叫做right and flash。这个方法呢,是代表把数据写到一个缓冲,同时刷新,刷啊刷新该缓冲,注意啊,不能写一个right。如果你写一个right方法,只只是把数据写到缓冲区,但是没有把缓冲区打到我们这个通道区,所以这个数据是得不到的,因此这边一定要用的是right flash。这个right flash其实是两个方法的合并,它是它是right。方法加flash方法。那也就是说,你可以理解是将什么呢?将数据写入。写入到缓冲。缓冲啊。并并刷新。刷新。好的,刷新,其实先生把这个缓这个缓缓存的数据再写到我们这个管道就发出去了。
11:03
那这地方我们发一个什么消息过去呢,那这个地方又要进行一个编码,不能简单的,你看啊,他这地方不能简单这样发,发一个字符串,那那不好使,那干什么呢?我们对它进行一个编码,在在发送。一般来讲,一般来讲。一般讲哈,一般讲我们对这个发送的发送的数据呢,进行一个编码。OK,呃,内容多的是啊,大家不用着急,这个东西不是一天两天就就就学会了,那么这里面有个非磁化的一个类叫on破的,里面呢,有一个copy copy buffer。好的,在这里面呢,我们就写上一个字符串,叫hello,我们叫做。嗯,我们看怎么回复啊。这边要求是怎么回复呢?要求的是hello客户端。好吧,那我就写hello客户端,然后呢,我这边进行一个编码呢,我写编码的方式写上这。
12:07
还是用我们的char set。u.u。诶,怎么点不出来了,对就他。都很好,也就是说现在呢,我们把哈呃哈。客户端按照UTF杠八的一个编码,放到我们这一个buffer里面去,然后呢,刷出去啊发出去就这意思,最后呢,还有一个方法也需要我们去处理,如果发生了异常怎么办?呃,处理异常的。处理异常,处理异常呢,我们也重写一个方法就可以了。在这。Exception touched。对,如果发生异常我们干什么呢?这里一般来讲发生异常过后,我们就要需要把这个通道进行关闭。一般是。需要关闭通道。
13:00
对不对,关闭通道。好的,那关闭通道呢,显然我们要通过这个C。就是这个Ctx.channel拿到在close。啊,这样就关闭了,当你直接这样关闭也是一样的啊,这样关闭也是一样的,他最终呢。也是能够把这个关闭掉,我们就这样调哈,叫ctx close,好,这就是我们这个handler,也就是说现在我写了这么久,其实我就写了一个什么玩意呢。其实我就是在这里写的一个handle,但是此时此刻这个handleer没有没有关联到,或者说没有加入到我们这个拍line,那怎么办呢?好,现在呢,我要把这个加进去,非常的简单,一句话的事儿就可以了,哪里。大家看在这个server端我们是不是。这个方法我们已经拿到了,嗯,拿到了这个管道,拿到管道以后呢,我们直接六一个ninety server handler完事了,这就加进去了。
14:01
当然有些同学说老师这个完全不知道在讲什么,我还是那句话,不要着急,待会我把这个代码写完了,给大家1d bug,然后对照这个一图一说,你的思路就会越来越清晰。我还是那句话,Ni,他崩装的东西太多了,不管哪个老师讲课,哪本书,他没有办法马上呃,直接把这个group往里面追给你讲,你越听越糊涂。越听越糊涂啊,那是肯定的,所以说我们只能是先把这个程序跑起来,然后呢,再反过来去去找这个地方,它是它是怎么怎么过来的,是不是这样讲应该更合理一点,好了,这是,呃,仅仅是服务器端而已。仅仅是服务器端而已,那现在我们还有一个地方有有有个最大的问题就是ni,我没有去关闭,就说你在进行服务器的时候呢,如果出了什么异常,是不是你要处理一下,那我这样子做一下,我把整个呢踹一下。把这个代码揣起来。
15:01
一起包。包起来过后呢,我发了你异常,因为我扔出去了吗?在Nike的框架里面呢,它提供了两个非常重要的方法,叫什么呢?Shutdown Grace。就是,呃,如果我们最终哈,不管什么原因,呃,你不管是出了异常还是什么,最终我要关闭它,怎么关闭呢?这有个shutdown Grace。就是优雅的关闭啊,为什么叫优雅的关闭,我们后面再说worker group.shutdown。关闭。这是服务器端,我们就写到这儿。
我来说两句