00:00
同学们在刚才写的代码里面呢,有两个细节问题必须要给他,要给同学们说一下。哪两个问题呢?好,我们先来看,我先把这个情况给大家模拟一下,大家看看。为什么会出现这样的情况?同学们看,如果我这样发送一段代码,你们看到它会有什么不一样的地方没有?我怎么去写呢?同学们看,如果我在这里写这么一段代码,c.right。And flash,然后前面这个代码呢这样写。我把这个拿过来。好的,这边我们就写。AB ccdacd,我看看重复几次abcdacdacd,再来一次CD,然后呢,我把它的类型指定下圈二。Set。第二,不能。
01:01
有点吧。OK。那么,我想问同学们一个问题。我想问同学们一个问题,这这段代码会导致什么情况发生?就是如果这样去运行的话。把这个改一下啊在这。好,如果我这样去发了这么一个字符串到服务器这端,到服务器端,请问服务器这边他会收到什么样的数据?我我先在这边做一个分析。首先同学们可以看到这边你发的这么一个字符串,其实它是16个字节,没问题吧,就说这边这个字符串其实是16个字节。是什么呢?是16个。16个字节,如果按照我们服务器这边去读取的方式,就这边我们不是有一个bit图吗。
02:00
也就是说这边呢,他应该是拿到两个int,也就是他把第一个。前八个字节当作一个闹。来处理,再把后面八个字节当做一个浪来处理,是不是,所以说这个抵扣的方法大家想会调用几次?来说一下。我说一下这个方法啊,对于该方法的调用,就是抵扣的方法D扣,D扣的方法会。会根据图形会根据。接收到的,接收到的这个数据。接收到的数据被调用多次。被调用多次,直到什么呢?诶也也就是说这个方法会被重复的执行。及重复的执行。直到。知道什么呢?同学们,知道确定,确定没有新的新的元素,元素被添加到list。
03:06
它会结束或者什么呢?或者是我们的这一个ber。这个buffer没有。没有更多的可读,可读自己为止。诶,所以说这个地方会调用几次,完全取决于你发的数据的多少,同时大家还知道,如果说。如果这个list就是我们这个out。List out不为空,不为空就会就会将什么呢?将。它的内容,它的内容就是一个历史的内容,历史它的内容干什么呢。就是传递,传递给下一个。下一个圈。China inbound handler处理。
04:02
而且这个处理也会被调用多次。这地方有点不好理解,就是它它这个in handleer也会被调用多次,该方法该方法这个它的这个handle里面的业务方法也会被调用次。该处理器。处理器的方法也会也会被调用多次,来同学们给各位同学运行一下,你们来看看是不是老师所说的这样,各位朋友先在运行。我们先运行服务器端。我们先把这个问题讲清楚啊,这个这个地方很细节的。来服务器已经运行了,我们运行客户端。同学们看这个客户端这边。够在这边发出数据了,看这边掉几次。是不是他的decode?地购这个方法被调用了一次,然后服他下一个handler的那一个read,呃,这个China read0是不是也被调用了。
05:05
这边是不是又他又说我又被调用了,他又读取了一次,也就是说你们可以看到它的过程是这样子的。怎么一个过程呢?就是我们这个D扣的调用了,他拿到一拿到一个浪,把它传给了我们下一个my server handler。这个read turn,然后他输出这句话了,对不对,然后呢,它这个bit to learn呢,又调用词de code,又读了一个int,把这个int干什么呢,又传给了我们这一个MY,呃,My bit to not decode,所以说你看到这个情况是。这样的。能理解吧,就这样一个原因,所以说我们这个图,如果前面这个图要画的准确一点,其实应该是画成这样一个图更加的清晰,应该这样子。拿到一个。值传给下面这个handler去处理,如果我们又拿到,按照这个流程又拿到了一个值,对,当然这个数据的数据到底是什么数据呢?可以根据你的情况数来来理解,可能是一个int,可能是个那也可能是一个对象。
06:15
是不是,所以说他是这样一个调用的流程。把这个。鲜花像,嗯。好,换成一个出题。所以说你可以这样理解,我们从这个BAT里面读了一个数据,加到历史里面,就是一个相当于说是一个可以被处理的对象了,或者说一个数据了,他就调用下面这个China inbound的业务处理处理了,然后你这边呢,低Co的方法又读了一个可以处理的数据单位,又交给我们下一个China in b hundred的业务方法进行进行处理,所以说这就是为什么同学们看到的在这里输出了两次。的原因,那还有一个问题必须要解决,就是这里,诶有没有同学发现MY在我改变了这个数据过后。
07:02
同学们看,注意听啊,这点非常的重要,就在我们客户端这头。客户端这边有一个。Handler,大家有没有发现,如果我传的是red and flash,一个ignore。它其实是会去调用我们这一个long To Bed的编码器。但是大家有没有发现,这次当我把这一个客户端的handler这边发的是这么一个字符串的时候,你会发现,诶,好像没有调用它的编码器哦。为什么呢?好,来继续往下分析,同学们都知道,同学们都知道,我们下一个就是它的前一个,应该这么说,该,应该说该。处理器的。处理器的前一个handler是什么?是不是就是我们这一个m to?My long To Bed no是没问题吧,是这个吧。
08:04
那我问大家第二个问题,第二个问题就是mylo died encoder,它的父类是什么?它的父类是不是就是?这个。它的分类是不是就是这个。Bite to mylo to,啊,Lo写错,Mylo mylo To Bit cold就是它的分类是message to message to是这样子的吧。所以说我们呢,要要去知道为什么这个没有调用,我们必须去看它的腹内到底发生了什么,来看它腹内。我们发现呢,这个家伙的类里面有一个方法叫write方法。大家有没有看到这个right方法里面有这个right方法里面有一个这样的东西,叫做accept out bound message,因为现在你这个是属于出战,他在这方去干什么呢?这个方法就是判断你这个MSG,就是你传进来这个MSG是不是我应该处理的,如果是他就会去调N扣的,如果不是就直接写出去了,看到没有说这个地方呢,是非常之重要的,就我把这个拿过来。
09:15
就相当于这个write方法有一部分代码。我把这段核心代码拿过来给他分析一把。还是放到这的。就是该类该。该类就是它的父类。有。就是这个叫做message to。Unco有一个这样的方法,我把这个方法呢写到这,大家看一下下就明白了。对,那这里面呢,这个write方法中这个判断就是判断什么呢?判断当前这一个就是你说的再直接就是你这个数据,OK,就你这个数据。你这个数据是不是,当然你他这边已经变成一个,呃,这边就变成一个字节数组了,对不对,Copy的buffer嘛啊,那这个类型到底是什么,大家在前面已经讲过了对不对,那么他就判断你说的简简单一点,就是看你这个类型当前这个MSG是不是。
10:16
是不是?是不是我需要,是不是应该。应该编码的,应该处理的吧,应该处理的类型。如果是就去进行扣的,如果不是,就直接把这个数据发给了下一个,呃,Handler对不对,就前再发给前一个handler。对不对,如果不是就跳过。就是说如果是就处理。对不对,如果不是呢?不是就跳过。跳过编码或者跳跳过跳过处理,就跳过这个nco的方法。这样子的好,那现在基于这样一个原因,同学们,我们下个断点,大家就一目了然了来,假如我们现在呢,恢复到最先前的状态。
11:09
这个。好来同学们,我现在把这个呢打开给大家处理一下。关闭一下。这边我们都关闭。关闭过后呢,我们来debug一下,你们看当我们穿的是一个浪的形浪,这个形状的浪这个类型的时候,它在这个地方下个断点。再一个端,下个端点,看看他在地方是返回一个真还是返回一个假。好朋友们。我们来debug。找到我们这段代码好。Short。这边可以运行run客户端,那边进行debug就可以了。跑起来了。跑起来是吧,我们后端进行一个debug。好的。同学们看。现在呢,已经到这里来了,这个MSG它就是123456 123456,那么我们现在来看往下面执行一把,诶大家有没有发现他进到这来了。
12:07
是不是进到这个N扣的方法去了。是不是,那么现在呢,我再换一个思路,把这个客户端这个debug关闭,我们把他的这一个C,呃,这个handler换一个写法。换成哪一个呢?换成。这样一个类型,就是我用,诶怎么怎么回事。换成这样一个,就是我用非磁化copy的buffer把这个字符串进行一个处理,按照UTF8的形式进行一个处理,把这个数据返回的数据类型进行一个right and flash,我们看这个时候呢,它会怎么去处理好断点是不是还下在这的。锻炼,我们还下载刚才那个地方应该没有没有拿掉吧。好,还在这儿,还在102行,好的,那同学们看我现在继续debug,因为server端没有停,我们继续debug code。
13:02
客户端来看。刚才是进去了,现在我们再看一下能否进去呢?好,同学们看这里。看这边呢,他。Mst。是这样的,大家看MSG的类型。这个一是onpo by buffer allocate下面的一个类部类,它真实的这个类型呢,就传的类型是这个类型的。对不对,他是这个类型,那么想想你这个类型跟你这写的这个类型匹配吗。跟你那哪写的,跟你这写的一个long类型匹配吗。你这写的是我要处理是浪类型,而你现在传过来类型这SJ。这个MSE的类型是什么呀?是UN po的bit buffer allocator的一个内部类的一个类型,那显然不匹配,不匹配直接是一个boss,如果是一个boss的话呢,我可以负责人告诉大家,他就直接跳到120行了,来走一个。
14:01
是不是?那但数据还是要发出去的,只是呢,不会再走你的N扣的方法理解。好,同学们,那关于这点我就讲清楚了啊,就是同学们以后要知道你在这个地方写的类型其实是跟你传递的类型要匹配,它才会进行这个n code的,否则你这个n code就会被跳过去理解了。好,我把代码呢再给大家整理一下,在。哪块代码台在这啊这里。就是如果map是当前要处理类型,就是就处理,就如果是就处理,如果不是就跳过,因此呢,我们要体现这个特点。第四个。就说的第四一点啊。第四点,因此,因此。因此我们在编写,在编写。N code时候,呃,N codes codes要注意,要注意类传入,传入的类型,传入的数据类型和处理的和处理的数据类型要一致。
15:15
类型一致问题对不对?好,两个问题我都解决了,一个是为什么客户端这边你改了过后呢,他就怎么样,就没有去调用N扣的,但是数据还是发出去了,原因我说清楚了,服务器这边呢,我也讲清楚,为什么它掉了两次对不对,因为你拿一个就是这个图讲的比较清楚,拿一个可以处理的,从历史里面已经可以拿到一个可以处理数据,他就去处理了,然后再来一个又去处理。好,这个细节呢,老师就讲到这里讲这里下面呢,我们还有一个任务就是要解决服务器端啊,就是这个服务器端呢,发送一个浪到客户端又怎么处理。对吧,那当然一样的道理了,你服务器发送一个闹到客户端,你是不是也得加一个。
16:02
编码器啊,客户端要拿到,是不是也有可能有解码器说它是相互的一个流程,那么怎怎么处理呢?我们下一个视频为大家讲解。
我来说两句