00:00
我们来编写ne的客户端。Ninety。C。Ninety。组方法,那跟前前面不一样的,就是说在客户端这边呢,咱们只需要一个事件循环组就可以了。客户端,客户端需要一个事件。事件。循环组,诶这个。世建。事件循环组。那一个事件循环组,咱们怎么创建呢,还是。O。Loop group对不对?拿到。嗯,同样我们这边呢,就用event。Event group group来接收就可以了,呃,同样道理呢,我们现在呢。
01:04
还是要创建一个。创建什么呢?我们要创建一个启动助手客户端的客户端启动。启动对象。嗯,那么启动对象呢?这个时候大家一定要注意,我们在服务器端我们用的是server boot strip,那么在我们的客户端用的是boot strip。这方要有一个区别,注意。注意客户端使用的不是他,而是这个别搞错了,如果你这搞错了,到时间是要出问题的,是bootrip,那我就创建一个吧,叫boosrep。Boot。所所以这个包不要引错了。用的是这个包,因为他这有两个boosrep,那么你不要以上面的,要用下面ninety包下面的boorep。好的,我们叫put shape,拿到three,嗯嗯,这个boowe go呢,我们要做相关的设置。
02:05
设置相关参数。相关参数。OK。还是我们一个链式编程哈,还是链式编程,我就快速走一下就行了,呃,But,这点什么呢?还是group扔,这个时候我们只需要放进去一个事件循环组,因为客户端这边也是处于一个循环的状态。为什么呢?你想一想,你发一个消息过来,假设你还有客户端服务器端还有消息给我,是不是我也是是也是个也是一个循环啊对不对,好点China一样道理,我们要指定,嗯,用将来它用来做反射的。NIO。IO什么呢?A channel。啊,这个就不是server class。对这边设置的是什么呀。上面这个我们先写一下。这个是。
03:01
设置线程组。没问题吧,下面这个呢是嗯,设置。客户端。客户端通道的实现内。时限内,因为这个它将来会用反射来处理的,我就放这了,接着继续往下走点2HANDLER,诶大家看它也需要一个handler的哦,为什么呢。你想一想,你。这边这个图呢,就没有没有没有在这体现出来了。就是你客户端这边其实呢,他也是在这里不停的循环的,循环的,那循环完了过后呢,我这边也会需要handler进行处理,其其实也是需要handle德处理的,那handle德处理。这个逻辑还有这个这个就这个原理是大同小异的,那下面呢,我们就开始往这里面加东西,还是六一个channel。
04:02
Initial。初始化的,专门做初始化的。对象那这边呢,我们用的socket channel。Shed。Shocked shocked。So啊,别别忘了so channel好,同样我们这边呢,也要去重写。这个方法叫。In channel。嗯,那这个方法咱们应该做什么事情呢?如法炮制,跟前面很像,也是像他的管道。Shay。我们这边是CH,应该是。是不是这个呀,像这个管道里面,那通过他这个China拿到他的paperline,就是客户端的paperline.at last一样的道理,我们这边也要放进去自己的加入。加入自己的处理器。处理器当然因为现在处理器还没写,所以说为了从语法通过呢,我先写了一个空,继续往下边写,所以你看客户端这边设置呢,相对要少一些,我这里做一个提示。
05:11
说客户端准备好了,客户端is OK。客户端OK,接着往下继续写。那你OK过后大家想你把这个参数设置好了,是不是服务器端,那服务器端那边是B。绑定一个端口,而我们客户端这边是不是应该是connect连接,是这样子吧,好,我在这写一句话叫做启动,启动客户端。啊去连接对去连接什么呢?服务务器端能理解。服务器端。好,那现在这个方法应该怎么写呢?同样用我们刚才的这个trap.connect。Connect这边呢,我们需要传入一个信息,一个是主机,一个是它的port。
06:04
那主机连接的服务器呢,我们就写127.0.0.1没问题,端口6668。嗯,那这个时候呢,我们仍然哈做一个SYC。这个YC呢,它就可以让这个方法不会阻塞在这里,那么我们返回仍然是返回一个channel future。这边我们会到时候会讲他的异步机制啊,这里面涉及到一个异步机制,还没有讲关于。关于China future,我们后面还要分析,要分析。应涉及到一个什么呢?涉及。涉及到ne的异步模型。异步模型。好的,那这边呢,他会干什么呀?有异常抛出,那有异常抛出呢,我们throws exception。那所以说这边呢,我们就扔出去,那这里这地方我们把它踹一下,为什么呢?因为我们也涉及到最后要关闭的问题。
07:06
我就翻了你一下。如果说那基本上我们还没写完是吧,看看。Connect connect完了功能,我们仍然是给关闭通道,通道增加一个监听,给关闭我们的通道,关闭连接也行啊,关闭连通道吧,关闭通道增加一个连接,进行一个监听。监听怎么了?因为我不知道你什么时候关,所以说有China点点拿到它的这个channel。点close future.sc也是做成一个非阻塞的。这样就OK了,这样就OK了,那有些同学我还是说了一句话,这句话呢,大家不要着急,因为这涉及到一个异步模型,如果这个异步模型理解了,你才知道他是怎么来做的,好吧。其实你可以现在简单的理解成就是说这个关闭,呃,关闭这个通道呢,并不是说马上关闭,而是在关闭通道事件发生了过后,我们再去关闭,并且呢,我进行一个监听,最后我可以通过这个China future来检测嗯,相关这个通道相关的信息,这是一个,这是一个异步,对异步返回的是一个异步对象,那么异步对象呢,它是呃,就是说这个方法调用完了过后,不会阻塞直接返回来,返回来过后呢,我们将来可以通过这个China future去看或者去读取呃执行的一个结果。
08:30
明白我的意思吧,呃,可能大家有点不是很清楚是吧,不清楚也不着急,后面再说关闭的话呢,怎么关闭,嗯,关闭是不是仍然是一个优雅的关闭是吧,我们这边有个group。这边呢,我们还叫group吧。那么叫我们就改个名字,还叫group。好,这边呢,我就用group。点稍。写完了,这是我们的ninety,呃,Client,但是呢,处理器是不是没写没写,为什么呀,因为你。
09:05
你这个发送消息。客户端发消息你还没写,接消息也没写,因此呢,我们还需要增加一个ninety。Ninety k handle。没问题吧?根据我们前面讲的这个逻辑,既然你是一个handler,因此呢它也要继承一个handler adapter,那我们继承是chinaund handler,那关于这个inbound代表什么意思呢?代表一个入站,那这里面又涉及到一个入站出站的问题,又是一堆。知识点。啊,关于我们,嗯,这个入站出站的操作是什么概念呢?要涉及到我们的管道,到时间我们再说好吧,不不着急,先把这个代码跑起来,嗯,这里面呢。又要重写一些方法,我们首先重写的是channel active,那么解释一下这个方法是干什么的呢?就是就是当。
10:05
当这样说,当通道通道怎么样啊,就绪。准备好了啊,就就叙事就绪。就是就会触发,就会触发该方法。OK,那一旦触发了,是不是你你就可以发消息了吗?那我就在这直接改写这个方法,我就写一句话。学到什么呢。我们也把这个塔。加这个ctx,我们也把它的上下文打出来,到底是什么,现在我就发消息了,呃,发消息仍然用这个上下文,就是China handle contact,上下文里面有一个刚才我们用过的叫right and flash,我们写一个。呃,往这里面写的,写东西把它发出去就完事了,怎么发呢?我们还是用这个非磁化,非磁化的on破的。On破的。
11:01
类来进行一个处理,那copy我们把相关数据拷贝到这个B里面去,怎么拷贝呢?我先写叫做我写句话叫hello。哈喽,什么呀?好了,Sir,我给大家来一个小猫叫喵。啊,给喵一声,同样我也要指定我们在发送的时候到底以什么编码的形式来做呢?我这里仍然是统一用。Utu TF杠八发过去。好没问题,发过去,那发过去过后同学们是不是我们服务器拿到这,拿到这个消息过后,他打印了,打印了过后是不是他也给我回了一个哈。呃,客客户端我们看汪汪汪叫的汪有没有。狗。啊,算了算了,这边就也来一个喵吧,客户端我也来一个喵。好。那现在呢,嗯,回到回到这边就是你把这个消息发送过去,服务器收到了,人家还给你回这个消息,你怎么办呢?还得重写一个方法来接收服务器端回收的消息,用哪一个呢。
12:13
显然我们用read还是用read,因为read呢,China read代表有数据可读了,这边好就是读取。当。哎,这样写。当通道通道有读取事件时。事件时会触发。因因为我们前面讲过,整个ni呢,它是基于事件驱动的,所以说它是有一种事件来驱动,怎么体现呢?就是你有一个事件驱动了我的某一个handler的某个方法,不就这意思吗。同学们学过javascript,是不是点一个按钮触发了某一个方法或者一个函数?其实道理都是相同的。
13:00
那这时候我们怎么去读呢?显然跟前面的思路其实是非常相同的,我们仍然是把这个MSG转成ni提供的buffer。注意,这个buffer呢,跟我们NIO的buffer不是同一个意思哈,不是同一个意思。强转一下。这是na提供的。Buffer接着继续往下讲,我们返回输出服务器返回的信息。服务器,服务器发送回复的吧,回复的消息。我搜一下。那这时候呢,我们用BBer.to string,因为它是个字节数组是吧,所以你要转成字符串,同样我们要指定,呃,转的时候按什么编码来转,因为对方发的时候是按U8,那我再进行。呃,转换成字符串的时候,我要指定是按UTF杠八来进行转换,完了过后我们也可以拿到什么呀,服务器端的地址。
14:08
服务器的地址。同学们,只要你要只要找像只要你需要找信息,你就你就到这里面去找就行了,这个里面的数据,待会我们第bug的时候,你会发现这里面信信息量非常大哦,啥都有你想要的东西,他都可以给你提供上下文吗点。点什么呢,Channel?点remove。地址好就这样子的,同样呢,我们也可以在这处理一下,他异常发生了怎么办?对不对,我们也可以加上一句啊,就异常发生的功能,我们把通道关闭就可以了,也可以把信息打出来。点这是一个数据信息,然后呢,我们再关闭异常的信息,Close。没事儿。好,同学们。现在我们辛辛苦苦是不是又把客户端的handle写完了,是不是应该加入到我们这一个拍烂去呢?的确,我们加进去六。
15:07
Ninety。我们的c handler新闻。OK,那同学们想一想,现在的代码是不是一来一回我们都OK了,都OK了,那我们现在呢,就可以来先运行一下,看看我们代码能不能正确拿到数据,拿到数据过后。我们就会来做下一步分析,什么呢?就是对照这个程序进行分析,看看Nike的模型特点怎么一个一个体现出来的。好,同学们,我们先来看诊断代码。服务器端和客户端是否能够正确的运行,如果有错误我们就调一下,因为这是咱们现场写,有时候呢,就是可能会出点问题哈,如果有问题我们就调。没问题,我们当然是好事,他说,现在服务器已已然是准备好了,来朋友们运行。来运行。
16:00
那运行过后呢,我们可以看到。诶,大家看到这边他说服务器端OK,这边服务器回回送了一个hello客户端喵喵喵,而且他告诉他的地址666668没问题吧。关于上下文呢,从这看出来,其实也看不出来太多信晰,待会呢用debug来看才看的比较清晰,因为我们idea的debug功能还是非常之强大的,再看这一头。我们看这一头。是不是这边他读到客户端发送消息是hello server喵喵喵,他说你好,服务器喵喵喵,然后呢,客客户端的地址是这样一个端口,也就是说我们还是非常顺利的,就把这一个服务器端的,呃,程序客户端服务器的一来一回给他写完了。那下面呢,老师就要开始来着重的分析。这一个这段程序跟我们let模型的一个关系。那下一个视频,我们再来进行一个分享。
我来说两句