00:00
Net编解码器和handle的调用机制。基本说明前面我们已经学过了,Ni的核心组件有China even the China future China handler和China people。China handle他充当的是什么角色呢?他充当处理入站或者是出站数据的这个应用程序逻辑的容器,对不对?那实现了比如比如说比如说实现了China in bond接口,或者是China in bondund adapting。接口,那你就可以。如果实现了这样的接口,你就可以接收入站事件和呃和数据,这些数据会被业务逻辑处理。当我们要跟客户端发送响应的时候,注意,我们要跟客户端发送响应的时候,也可以通过China in band handle冲刷数据。业务逻辑通常会写在一个或多个China in镑中,China。Out handler原理是一样的,只不过它是用来处理出站数据的,那这一段文字呢,它描述了我们的handler它的一个作用,以及英镑的handler和out banner handle它的一个区别,那这个文本呢,它这段文字它往往描述的不是很清晰,所以下面呢,我们有一张图来再说明一下何为入战,何为出战。
01:21
我们先来看,我们知道handleler呢,其实都是在我们China里面,所以说我们可以认为China paper呢,它提供了或者是呃,管理了China hundred的容器,它是一个。管理China handler链的一个容器,那如果我们以客户端应用程序为例,如果事件运动方向是从客户端向服务器端,那么我们称之出站。即客户端发送给服务器端的数据会通过pipeline的一系列China out handler,并且被这些handler处理,反之则称为入战。注意这个情况啊,什么叫反之就反过来你看。
02:04
这这个图要怎么去理解,你要这样去理解,这是我们的可端。对,可能端可端的数据如果要发送给我们的这一个什么呢?Serve,比如这边是serve,那它这个数据处理好了过后,其实它是通过一系列的什么呢?China out found handler,一系列的这个。Autound handle处理,然后通过我们这个socket。传输到我们的服务器端明白。那反过来也是一样的咯,如果我们服务器端的数据往这边推送,推送到哪里了呢?到我们这个客户端了,到我们客户端,那么这个客户端,客户端数据就是他肯定是从这个socket拿到的嘛,那从这个soet取的时候是通过我们这个客户端的China pierland,哪些handle呢?就是inbound handler明白,也就是说这个数据如果是往外面扔的。
03:02
OK,那么我们称之为outb,如果这个数据是从这个soet,呃,读取到我们这个chinaline,并且向我们这个程序这边流动,我们就称之为inbound handle。理解这个意思吗?同样我们server这边也会有这个强制排,道理是一样的。道理是一样,我就不再多说了,就是跟他一样,就是如果是。如果这个server端它的数据是。是往这边流动,就是它的数据是往往这它这个pipeline里面去写,把这个就是它的数据向这个server端的China pipeline往里面扔,那么我们也是调用它的什么呀,Out handler。如果这个数据是从这边来了,就是我要通过这边的China往这里面放,那么我用的是什么呢?用的是inbound handler,道理是一样的,明白这意思好的,明白这个道理以后呢,我们接着继续往下看。
04:03
编码解码器,当na发送或接收到一个消息的时候,将会发生一次数据的转换,入站消息会被解码,没没什么问题吧,比如说你入账的数据到哪里了?你你比如说还是以这个。以这个这个处理为例,比如说这边数据啊,服务器端发了个消息,通过这个烧发过来了,入站的数据往这边流动,那肯定要被解码,因为你是通过so拿到的肯定是制解码二进制,制解码的数据嘛,肯定要经过一个解码,所以他这说的是什么呀,要经过。解码反过来从字节,从字节转换成另外一个人就是这个。我们所说解码是从。自检转成另外一种格式,比如说Java对象如果是出站呢,出站肯定是要被编码成字节,还是以刚才这个图为例,比如说同学看。我们这个数据,我们这个数据看。
05:03
这边是我们的业务数据,他要开始,呃,通过这个,它通过一系列处理到我们这个soet,发给我们serve端,肯定在这个过程里边,在这个过程里边就是在调用它的out handleer里面肯定有一个什么呢?编码器,这就是为什么你们看到编码器它其实是一个什么呢?它其实是一个outbound handler,而解码器呢,其实是一个inbound handler,我们来给大家看一下源码,比如说我举个例子哈,我给大家举个例子。打个比方,我们看前边我们在讲这一个。口袋的时候我们看一下。我们随便找一个找客户端吧,我们找客户端这么看,客户端这边往这边看,客户端是不是他在发送数据的时候,他在发送数据的时候,他这边会去调用一个。就是我们的encoder,这个encoder,其实它本质呢也是一个handler,而且它是一个什么handler呢?它是一个outbound handler,我们看是不是这样子的。
06:06
走,往里面追。看它调的是message code,再继续往里面追,同学们看是不是一个out般handle。为什么呢?因为它其实就是我这所说的,它这个顺序走的是auto,它要把这个数据图图,呃,放到我们这一个soet里面去,肯定要进行一个。编码反过来了,反过来当你拿到这个数据过后,从这个拿到这个数据过后呢,你其实是英磅handle,这个英镑und handleer里面呢,其实就有一个叫做解码器,解码器其实它也是一个handleler,它是属于英镑的handleler这样一个类型的,我们来看是不是这样道理,在服务器端,我们看一下服务器端是不是我们用过用过这个。Prototype。Pro decoder,我们看一下这里,这个是不是一个inbound handler往里面看。
07:01
往往上面追吧,从这开始追。是吧?他继承的是message to message deco解码器,接着走,同学们看是不是China inbound adapter,再往上面追。是不是就到了我们。这个China inboard没问题吧,同学们好,所以说这个关系呢,一定要把它搞清楚,什么叫出站,什么叫入站理解。出站和入站呢,其实你可以理解成就是我这个数据在个China,是往这个socket这边走,就叫出站,如果是从这个socket的数据往我这个圈里面读,我们就认为是一个入站,这样去理解就好好记了,好同学们继续往下看,继续往下看。T呢,它本身也提供了一系列的,呃,这个编解码器很多,他们都实现了China inbound handler,或者是China outbound handler,你要么是入站,要么是出站嘛,刚才已经讲过了编码。
08:02
我们再进行这个编码,就是叫做inco的时候,其实它输,它是这个out bound hundreder,如果是入站的in bound hundreder,其实是一个解码的过程,是不是好的,在这这些类中,China read的方法已经被重写了,一般是被重写。以入站为例,对于每个从入站的China读取到的消息呢,这个方法就会被调用,随后他将调用由解码器提供的低扣的方法进解码,并将已经解码的字节转发给China排单的下一个China。Inbounder,因为你是解码过程,是不是相当于从这个soet里面读数据啊,入到我我们这个拍PE里面去了,所以它其实叫做inbounder,能理解好接着继续看,那现在我们看一个具体的一个decoder,因为下面我们要讲的是解码和编码器,我们先看解码器,By by to message decoder。那么大家看这张图,看这张图,这张图呢,其实可以看到bed to。
09:04
Message它是一个decoder,它是一个decoder,他这个decoder你看是从他的关系是什么来呢?他先去继承了。China inbound handler adapter,而这个类呢,它又继承了China,呃,Handleler adapter,以及实现了China in bondund handleer这个接口,而这个接口呢,大家看到这个接口又继承了这个接口,而我们上面这一个类它又实现了这个接口,明白说整条整整个这条线呢,它是属于我们这个英镑的handle德尔这条线的,所以大家可以看到关系示意图,这里面还有一个问题,就是会出现一个粘包和拆包的问题。什么叫粘包?什么叫拆包呢?我简单说一下,后面我们还有个章节专门讲拆包和。呃,粘包和拆包问题啊,嗯,为什么会出现粘包和拆包问题,是因为这样子,由于我们不可能知道远程节点是否会一次性的发送一个完整信息,TCP有可能会出现粘包和拆包问题,这个类呢,它会对,就是我们说的这个类,它会对入站数据进行缓冲,直到他准备好,准备好被处理,这句话我要我要解释一下,比如说。
10:18
这个地方啊,同学们。这个地方是我们的端,这个是我们的server端,明白,比如我们这个server,呃,这个比如说我们这一个。呃,可端要发送一个对象过去,Java对象假如说发一个Java对象,这个Java对象肯定是由很多字节组成的,对吧?到我们这个整个这个管道的时候呢,它是字节的形式,比如说它总共有100个字节,100个字节才是整个这个圈Java对象的全部信息,但是大家想我这个serve端在读取的时候,我呃,Serve端在读取的时候,我怎么知道你是你发过来过后,你这个发过来过后到底是多少个字节才是一个完整的加务对象呢?这就出现了我们所说的粘包和拆包问题,当然解决方法很多,我们可以做通过做做协议来解决,对不对?比如说你在发这个客户端,在发这个加入对象的时候,你先发一个信息告诉我,我这个加入对象一共有多少个字节,那么这个问题就能解决?
11:22
对不对,但是整体怎么去处理,后面呢,我们有个章节在哪里讲的呢?同学们先给大家看一下,就在这。在这个章节我们专门会讲TCP粘包和拆包的解决方案,大家呢,这边先听一下,听一下,那么我们接着接着往下看啊呃,怎么解决。解决呢,其实我们这一个。就是Nike他提供的,他自己提供的一系列的解码器,本身就相本身就相关的业务逻辑来处理,我们看一下他是怎么处理的来看代码。下面是一个关于by to message deco的实例分析,比如说我可以这么去处理。
12:02
嗯,打个比方,现在我的客户端服务器端通讯这个客户端呢,要发一个int过来。明白要发一个int数据,大家都知道,在我们Java里面呢,一个int是四个字节,没问题吧,一个int是四个字,所以说我再去写这个,呃,他的bit to message decoder的这个子类。比如说他这有个叫to integr decoder,这个to in inter to inegr decoder呢,我让他继承了by to message decoder,那我可以怎么做呢?我可以这么去做,大家看代码,我可以怎么做,我去重写它的这个抵扣的方法,就是这个叫解码吗?我怎么处理呢?大家看我先看你过来的这个bed buffer。就是你这个入战的buffer。有没有大于等于四,如果在大于等于四的情况下,我就读一个int,诶这样是不是就就能保证我是四个字节,四个字节的进行处理,就不会出现什么呢?拆包和粘,粘包和拆包出现的一个错误,比如说你发了你你发了这个八个字节过来,八个字节过来我就知道每四个读一次,因为我这按in读取的,我不会出现,诶把你。
13:18
把你这两个字节先先读取了,当成当成一个值,不会这样子了,因为我在这里是按照一个协议,或者说我我这规定好的规范来处理的,就不会出现前面所说的粘包和拆包问题,那这样讲了呢,大家肯定还是不太明白,说老师这个有点模模糊糊的,那么我给大家画一个图,待会画一个图,我们先把这段文本读一下,再画一个示意图。在这个例子里面,就是这个deco,这个例子里面呢,我们可以看到有这样一个特点,每次入战的bit buffer,就它这种入战bit buffer。将其解码为一个怎么理解的?这是不是解是按照一个int一个int来理解的,然后将它添加到一个list中,哪个list就是out是不是这个?
14:06
Out诶,然后当没有更多元素可以被添加到历史的时候,它的内容将被将会被发给下一个China英镑,它为什么是英镑的呢?为什么是入战的呢?因为现在我是在解码,明白刚才已经讲了,解码对应的是英镑handle。对,编码对应的是al down the handler,不要不要再记混了啊,刚才这个图已经说的很清楚了,那么in特在被添加到list的时候呢,会被自动拆中成为一个inegr,再调用read in,呃,Read。呃,Int方法前必须验证所说的BAT buffer是否有足够的数据,好,那现在我画一个图再来对这段文本,就是对这个我们这儿写的图。Inegr decoder。这一个呃,编码器它的第一个原理,我们做一个说明,好,我把这个代码拿过来,代码拿过来呢,我们来看一下这块它是怎么处理的,好吧。
15:05
它实际上是怎么处理的呢?来,朋友们,我画一张图。好的,比如说这个数据来了,诶就是我从这个管道,呃,或者从从这个socket socket里面呢,我已经读到了很多的字节,但是呢,我我必须按照四个字节,四个字节组成一个int来进行处理,我会怎么处理呢?好,这个地方我们认为就是我们的拍烂。啊,就是China China paper China paper。啊,这是我们的强制排单。PIPE。案例。百兆怎么又没电池了,这个电怎么?好,这是我们强制判断,那数据从哪来的呢?肯定就是从我们这个socket读过来的,对不对?好,大家看我怎么处理。首先呢,我先经过就是这个数据从这边来的啊,大家可以想到这是假设是怎么收集的。
16:08
So,好,So,数据呢,扔到我们这一个服务器端的。China拍来了,但这个时候拿到数据,大家知道肯定是按什么呀,二进制的字字解码来的,就是二进制,注意听二进制字节码没问题吧,肯定是按一个字节字节来的,那到我们这个拍PE里里面呢,我第一个要调用的就是我们的这一个。这个解码器。好,这个解码器我怎么用呢?不着急,肯定它是一个英镑的哈,因为我是从这个socket里面的,我把这个cket数据帧向我这个pipeline里面读取嘛,肯定我调的是一个英镑handle,所以说我调的第一个就是我的two。Integer integer第一抠能理解这本一定要认真听啊,同学们这边如果你没理解好,后面会出问题的,好读到这,那读到这里面我会我会怎么去处理呢?当我们调到我们这个抵扣的方法的时候,其实我已经拿到了这个by buffer,这是一个入战。
17:12
入战buff,所以说我可以理解成在我们这个。这里面呢,有一个入战的buffer。若占八份儿。好,这边我写一段文字。这叫什么呢?这叫入战。Bite buffer。这是我们来提供的。这个容器数据容器放在这,那那这里面这个容器这个数据肯定有很多的信息了,对不对,同学们,这这个地方将来会会放很多,比如说你发了有八个字节啊,假设八个字节里面呢,就有这么几个小空空小空格。我幻想。好,换一个不同的颜色啊,一个。两个三个四个五个六个七个八个,OK,好可以了。我把放在这了。
18:03
追听。把这空间还有点不够哈,不够往里边挪一下吧,同学们不着急。把它讲清楚。好,这边我要挪一下了。八个。两个。三个。好,往那边挪一下,再。好,比如说在我们这一个入战的better buffer里面呢,我有八个字节,那我怎么去处理呢?好的,大家看我的这段代码,我是先判断它现在在这个这个by buffer里面,Read read able bits是不是大于零等于四,是不是这个方法我们用过呀,就是可读取的字节数如果大于零四,现在有八个吗?肯定是,肯定是大于零四了,那八肯定大于零四,好,下面我要做一个什么处理呢?好的,同学们往下走。下边呢,我就调用我的这个抵扣的方法了。
19:02
这是我们抵扣的方法。第一。De扣的方法,这个D扣的方法呢,它会干什么呢?它会挑出四个比,比如说我们挑的是,假如我们数这样读啊,比如我读的啊,读这这四个,前面这四个。前面这四个,这四个呢,比如说分别放的是四。七。八。二假如说啊好,这是我们的四个字节,那么这四个字节呢,我会干什么呢?同学们,我会把这四个字节组成一个类型,就是把这四个字节通过我这个处理呢,把它组成一个,呃,组成一个四个字节。每四个字节组成一个int,好,组成一个T,我把它放到哪里去呢?好,接着往下看。对,我这边不是有个list吗。对,在这个decode里面,我有个list。好,我们再画一个图形。
20:01
好的,这儿有一个list。这样一个例子的,那这个是我会把这四个字当成一个整数来读取。当成一个整数读取好,那么就是相当于说这个字解,这个字解,这个字解,这个字解做成一个整数读取,比如说我们读到我们这个list里面的第一个元素加进去了。放进去。好,比如最后这个数据读取的是一个,比如幺二。124吧,好,这个这个就读完了。是吧,就读完了,读完过后大家记不记得我们这个可读的,这个读一读完了过后这个可读的。有一个read的。Reader index它是会后移的,还记得吧,就是。不是你在你在这做这个read int过后呢,整个我们这个bit buffer它有个指针嘛,它会它会往后面移动,还记得吗?就是那个reader index还还有印象吧,好那是不是读完了过后他又再去读,后面再按四个来读取啊,为什么呢?因为你用的是read,好read it又读到一个。
21:05
好,又把后面这四个字节当做一个整数来读取啊,假如后面这个是七。一。三零当成一个整数读取,好,假如这个数读出来是一个二。六七假如哈好,这这个时候呢,Read read可读的就读到后面了,这个时候他再去读呢,他发现已经不再大于等于零了,对不对,不再大于等于零,那这个就结束了,就不能再读了,就结束结束了,结束了过后呢,大家可以看到。这时呢,他会把这里面数据就是这个扣的方法,应该这样画。好,这样子画这么一个图形就更更清晰了。好的,那呃,他把这里面这个历史的,整个这个历史的交给什么呢?交给下一个China。英镑的handle德去处理也是下面呢,肯定还有别的棒,对不对。
22:00
因为这这个地方只是第一个我们的handle德尔嘛,就是如果handle德,那就交给下一个handle德尔去处理。好的,那这边我们画,比如说这是又一个China。China什么呢?这个inbound inbound。Inbound handler。就把我们这个数据扔给他了。把这个list又传给下一个去处理。就这样一个流程。所以说大家可以看到,嗯,通过这个图其实比较清晰的描述了我们在自己去重写这个D扣的时候,它的一个逻辑是怎么来处理的,那一般来讲呢,一般来讲我们会把这个decoder会写在我们的D前边,就是相对前面的位置。因为你首先得把这个数据进行一个解码,在这个地方你才能去处理,对吧,所以说你可以认为这是我们的业务逻辑,逻辑处理handle。
23:02
能理解吗?那如果说这个数据是,呃,由我们这个China往这个soer里面去写,各位朋友。各位朋友,比如说我们这个数据,你将来这个程序有数据,是不是要要经过这个China paper处理过后,又往这个shop里面写,发给我们的客户端,是不是,那假如这样一个顺序呢?好,同学们看,假如我们我们将来还有一些就是要通过这个China China paper那里面的handleer进进行这个处理给后,把数据又放到这个soet的回回显,或者回送给我们客户端,那这边的handle呢,就是就上面这一系列handle,就是我们所说的什么呀,叫out handle。能理解吗?呃,就是这就是我们所说的一个出账和入账的关系。诶就是这边呢,上面这上面这块就是China。什么样,Outbound?
24:03
Band handler。当然有多少个,那根据你的业务逻辑来处理了,就是这个这条线呢,就是这样流动。这样流动。好,同样前面呢,还有一个对吧。这个也是一个什么呀,China out大这个数据处理完了过后从这边。扔给我们烧,往那边扔好,这个就叫出站,而这个就成为入站,那么入站里面的每个这个deco的逻辑呢,大致就是这样去处理,关键就要看你这个deco你到底是按照什么逻辑来处理的,比如说刚才老师这地方是要按照这个int去处理,所以说我在这写的是每次呃就按一个int来读取,放到这个al里面去,交给下一个韩ER去处理好的同学们,那关于我们这所说的这么一个bit。Bad to message decoder一个实例就分析到这儿,同时呢,也把我们这个decoder的一个逻辑讲清晰了,下面呢,待会我们就来举个例子,就是用let。
25:04
啊,Handle的调用机制来讲,这个机制的时候呢,我们就用使用自定义的编码器和解码器来说明它的使用,以及出战和入战到底是怎么玩的。用一个具体实例,再加深对前面这个理论的认识,好,同学们,那这一块这个by to messageo先给他讲到这儿,还有一个入战和出战概念,也就先聊到这里了。
我来说两句