00:02
Net快速入门实力TCP服务,我们现在呢使用net来开发一个TCP服务。Nit快速入门实力的要求是这样子的。是用idea创建一个nit项目啊,前面其实我们已经创建了一个项目,对不对,只是没有还没有引入nit相关的包。来服务器呢,服务器这端,这端我们要求在这一个端口上进行监听,客户端能发送一个消息叫hello,服务器。服务器可以回复消息给客户端哈,客户端就这么一个通讯。针对nit快速入门实例的目的呢?就是我们希望通过该案例对nit线程模型有一个初步认识。便于理解nit理论模型,就说我们现在用这个案例呢,来反过来看。关于net模型是怎么回事。也就是说我们用程序。再给大家去debug去看一下,呃,就是一个boss group里面有多少个ne IO event group worker group里面有多少个IO lo。
01:11
以及他们之间的一些调用关系。好的,那现在呢,我们这个M项目其实已经创建好了,我们直接引入nit包,看一下我怎么引入哈,打开。我们的nit项目现在呢,还没有办法引,还没有引入我们nit包,怎么引呢?非常的简单,看我的演示,看我的演示,OK,这里面首先呢,我们选择project structures。没问题吧,然后呢,点击这选选项页,选上dependence。这样一个加号,然后这我们要加libraries。对lovers大家看,其实我这里呢,已经有我我曾经已经下过一个这个东西了,就说。我已经下过这个ninety4.1.20了,如果说你没有下过,你怎么办呢?同学们,你们点这个new library.from MAS。
02:09
好,然后你在这输入一个东西啊,同学们,因为你第一次的话呢,你要这么去输叫io.net。冒号ninety。港澳。大家明白我的意思吧,就说你在这里,因为我们这个来其实直接下他的一个all包就可以了,里面呢,他把相关的这些呃类还有接口全部给你准备好了,呃同学们一定要注意呃,在你进行下载的时候呢,呃,各位同学呃,你们需要把source还有Java DOS都给它勾上。呃,这两个选项的代表在下载它炸包的时候呢,同时把它的源码包还有加do一起下载下来。那么把这个勾选上代表什么意思呢?把这个勾选上就代表待会在我们Nike project project这个项目下面呢,会产生一个label文件夹,它会把下载好的nit相关的包放在你的Li文件夹下面去,如果你不勾选这个,同学们。
03:08
你不勾选这个呢,就会生成一个本地仓库,就是关于关于这个本地仓库的概念我就不说了,它会生一个本地仓库,如果你勾选的话呢,它会直接把我们这个包相关的包给你放在内部文件夹下面去,好吧,你看现在我开始搜索。点击搜索了,搜索呢,你需要联网哈,联网联网一会呢,这个地方它应该出现它搜索到的相关的炸包,这个地方需要大家稍等一下。好,稍等一下,我把视频先暂停一下吧,可能时间比较长一点。同学们,大家可以看到。嗯,一会过后呢,就是你联网一会过后呢,他说他发现了127个相关的包,我们下拉一下,那同学们看这边是5.0的都不要了啊,你看现在最新的版本应该是4.1.39的,但现在我们不用这个版本,我们用。
04:03
1.20的,我用这个1.20这个版本呢,像是。2018年发布的,也算是比较新的,好,你点ok.ok过后呢,这个地方就给你勾选,就给你下下来了,同学们,你们第一次的时候不会有这么快哈,因为我曾经下过一次,所以速度会比较快,那现在呢,它其实有三个部分,一个就是下,一个是源码包,这是我们开发用到的,用到的一些class文件,这边呢是源码包,这边是加dock包,你都把它勾上。因为后面我们都需要。点OK。哦,他说已经存在了是吧,他说这个库已经存在了。呃,存在了,我没有存在吧,我记得哈,那没有就把这个勾上吧,这这选中就行了,因为他把这已经选中了,点ADD。好把这个勾选上,好把这个勾选上,点应用。点用过点ok.ok过后呢,这边大家可以看到,就生成了一个Li文件夹,然后呢,这边就是相关的我们的这个下包,这边呢是有源码包。
05:09
这是我们的源码都在这,而且呢,大家可以看到里面有个example,这个example下面啊,有很多关于ninety的DEMO案例。代码案例可以用来进行学习,后面我们做源码分析的时候呢,还会用到这里面的相关的一些这个案例,好,这个我就说到这。说到这过后呢,大家回头回头,现在呢,我们就其实已经可以做Nike的开发了。跟上老师思路,我们在原先的这个包下面呢,我们新建一个包叫Nike包。各位来。好的,那么我们会把let相关的程序放到这,我们先建第一个程序。先接一个包,叫simple。第第一个比较简单的那程序simple,好的,根据刚才的分析呢,我们需要写服务器,还有客户端,我在讲这个案例的时候,我的思路是这样子的,大家跟上我的思路啊,我的第一步,我要做的第一件事情,先编写服务器。
06:16
服服服务端程序,那么第二步呢,我们编写编写客户端。顺序。第三一步我们做分析,对什么呢?对Nike的程序。进行一个分析。分析,看看看看看看和和,呃,看看这个Nike模型是怎么运行的ni模型。的特点。来,来,模型。特点,也就是说我们要用这个程序呢,反过来去跟这个跟我们前面说的net模型进行一个对照,哪个地方是boss group里面到底有几个IO event的group,哪个是worker group里面有哪些IO event的group,然后呢,还要找到PI nine,对,我们还要找到什么呢?就是这个channel。
07:13
还要找到他到底里面是怎么去,就说怎么这个worker group里面到底有怎么去指定有多少个这样的I event路。我们看一下,那现在呢,我们就根据刚才的思路,我们先写服务器端,刚才老师思路,我们现在服务器端的话呢,我就写这么一个名字叫let serve。好的。那第十问。稍等,我们写上主方法。好,诶。协助方法。嗯,另另方法写完了后,我们下面要做的事情呢,就根据老师的思路来了啊首先呢,我们要创建什么呀,根据刚才这个图还记得吧,我们要创建boss group。
08:03
和什么呀,Worker。Worker group。Gup非常简单,那怎么创建呢,六。NIO,好,这个时候大家等一下。NIO。Event loop。创建一下。VR,那这时我们在接收的时候,这边我们就一般会写个bos名字啊,叫boss就是。Group,那通常情况下呢,我们写就写个叫boss group,呃,就是他是老板,那么干活的呢,叫worker group,那这个名字呢,我们一般用。这边接收的时候有event group group接收就可以了,下面呢,紧接着再创建lo。Event。Loop group。创建同样名称,我们要写这样一个名称,叫worker。
09:04
但这个名称是一个,呃,就是大家基本上就都喜欢这样去取名,这样呢也比较形象啊,老板和工人的关系。写好了,那么我在这里做几点,关于这里面我做几点说明,我们一边写一边做说明,好吧,第一个呢,就说我们这里创建了。就是创建了两个线程组。创建两个线程组。嗯,分别呢,是boss group和。什么呀,Worker group,第一点第二点,第二点呢,我们要说明一下这个boss group,呃,Boss group呢,他仅接受他指示处理。他只是处理什么呀,处理连接连接请求。OK,嗯,那么worker group干什么呢?它真正的啊,真正的要说。
10:05
真正的什么呢?与客户端和客户端客户端业务处理。处理会交给交给谁呀。好的,所以交给board worker group去完成。Work group group。完成。自己不做处理,第三点我要多说一下,这两个呢,都是一个无限循环,就是他最后他在正式运行的时候,这两个都是无限循环。两个都是两个啊,两个都是循环。无限循环。最后到底层呢,我们在追的时候,你会发现两个都会到一个循环。好,创建这两个过后,下面呢,我们紧接着来创建什么呢?第下一步我们要创建写到这里来。下面我们要创建服务器端启动的。
11:04
助手或者说启动的一个配置参数,创建什么呢?创建服务器端,服务器端。的什么呀,启动启动啊启动的。这个对象一个对象吧,呃,可以干什么呢?去配置参数。配置启动参数,我就开始写了六一个server,诶跟上老师说啊server。呃,Server什么呢?Server boots。Boot。最好的装进这个东西。我就写一个简,写一个B吧。达到了。创建这个助手可以干什么呢?它可以设置我们启动的一些参数,那么这里面呢,会使用。使用这个链式编程的方式列式编程。来进行设置,来进行设置,这里这段代码就比较复杂一点了,来进行设置。
12:03
跟上老师思路。大家知道,不是最。点第一个,我们首先group干什么事情呢,我们把。这个就是它这个group呢,可以设置两个线程组,一个就是第一个就是我们的boss group,第二个就是我们的worker group。好,这是第一个哈,那么我在这做一个注释。这是设置,设置两个两个线程组,两个线程组。线程组,这两个线程组如果对应我们的图片来说呢,其实就是它和它明白,待会我们再看具体的哈点面势变成继续走channel。Channel。这个an Neel,这个channel呢,我要指定一个什么东西,大家看,我要指个NIONIO叫做什么呢?Server channel。
13:03
什么意思?解释一下。这边呢,就是要说明设置,呃,就说我要设置的是将来我们这个服务器的通道呢,是用的这样的一个,呃,这样的类型啊,就说写到这啊,使用什么呢?使用NIO。Server China作为作为服务器的通道实现。通道实现就不着急啊,这个我们慢慢来说,因为没有办法一句话就全部说完,紧接着继续来走点,下一步呢,我们来走一个option是一个选项。Op t这个选项我要做一个什么呢?大家看,我要写channel。China什么呀,Option?点点一个什么呢?大家看我这样写,So。
14:01
Backlog。然后呢,128。好,这边是设置一个这样的东西,我先写到这里,设置什么呢。设置线程队列。线程队列线程队列什么等待连接的个数?连接个数。紧接着我们继续往下走点,下一个是什么呢。Child option。Char option,我们在设置什么呢?我们要设置,呃,它的整个这个连接是保持一个活活动连接状态设置什么呀。设置。保持。保持什么啊?保持活动。活动。连接状态。那我们这怎么去设置呢?非常简单,还是刚才那个channel option点。
15:01
So。怎么样?Keep alive keep alive写一个true。好,紧接着继续往下编写。下一个呢,同学们就很关键了,下一句我们要干这样一件事情,设置它的处理器,Child child handler handler,这句话我先做一个解释。干什么?就是给。给我们的worker。就是给我们的这个worker group的某一个啊,给我的什么呢?它的一个ne。就是我们叫。叫这样写吧,叫。Event loop。一问的路途。的什么呢?对应的管道管道。设置设置什么呀,处理器,这现在我们在来看这个图就有点感觉了,大家还记不记得我们在这讲过,将来你在注册呃,把一个channel注册到一个S上面过后呢,后面这边会有相应的。
16:11
这个排online就是我们的管道来进行处理,而管道呢,里面就可以写我们的处理器,这个处理器可以是ni提供的。Na提供的也可以是我们自定义的。也可以是自定义的,所以说我们这呢,我们待会儿写一个自定义的handler来接受从客户端发送过来的消息。说这边他的机制是这样子的。那我就开始来写了哈,嗯,怎么写呢,六。Channel。Initialize就是China的初始化的一个,呃呃,一个一个对象,那怎么做呢?这边我们要操作整个过程中使用底层用的是socket channel。So channel好,这边呢,我们要去,呃,重写一个方法,这个方法是它叫in channel。
17:07
这句话,这个地方我们要做什么工作,我也做一个注释。这段是指的什么意思呢?就是往就是像什么呢这样写啊。那这句话就是,呃,我我我把这个也写成就是创建。一个什么呢,通道。诶,要求通道初始化对象。这里我使用的是匿名对象的方式来创建的,所以说我直接就溜了一个,在这六里面呢,里面有一个方法叫I channel,我们在这个地方可以完成一个什么呢?完成这样一个任务,呃,把向这个通道向这一个。呃,Group就是worker group关联的一个,嗯,拍那里面增加一个handler,好,我就写到这啊,像哪里呢,就是给。
18:06
给拍烂。PI net。拍on设置设置什么呀,处理器。那怎么设置处理器呢?就用这个方法,我们看怎么写啊,首先大家看在init channel里面,我们可以拿到socket channel,拿到这个soet channel呢,我们调用一个方法叫pipeline。Pipeline,这个pipeline就会返回什么呢?返回这个圈了。关联的。Pipeline就他也就是说,也也就是说我们这边最先注册的这个China呢,我呃我我是呃,我是通过这个channel可以拿到这个pipeline,然后再把我的handleer扔进去。其实呃,Channel和这个pipeline他们之间是待会我们追追源代码,你会发现这个通过channel可以拿到pipe烂,通过pipeline呢,也可以拿到China导他们两个是相互包含的。
19:09
嗯,对,我们接着往下讲哈,这个地方你你们不要着急学什么,任何东西呢,都有一个过程,没有哪一个老师,也没哪本书一下就给你讲清楚的,认真听就行了,接着往下走,ADD last,这个at last,大家想一想是什么意思?嗯,就是向我们的这个管道的最后增加一个。这个处理器,因为现在我处理器还没写,我先占位写个no,这边呢,我也。写个分号,好,同学们看这里。呃,他说这个。Ne shocked China ne shocked。那这个地方不行,还得改一下,因为这是在服务器端,所以说我们要加个server。哎,这样才对。
20:00
对,这样才对,就是ne server so China,整个在这个,呃,就是针对我们主这个boss group的时候呢,他用的是用的是server China,针对我们group China的时候呢,我们用的是shock China。好,这样就可以区分,接着我们继续往往下走哈,往往下走,到了这一步呢,其实我们已经把。创建服务器,这个服务器端启动的对象就配置好了,配置好配置好过后呢,我们下面要指定什么,同学们是不是我们该指定相关的这个端口了啊,我在这做一个提示。我在做一个什么提示呢,我说服务器准备好了。服务器。Are is。Ready。Ready。那准备好了以后呢,下面我们要去绑定一个端口。
21:02
对,怎么绑定呢?就用我们刚才的boot点。半端口,刚才我们已经说好了是6668,再点一个SYC。这句话呢,它会返回一个什么呀,整个这个会返回一个China future对象。这个。China future,我就简写这样。小。好,同学们在这呢,他会抛出一个异常,好,这个异常呢,我们就从这儿把它扔出去。好,扔出去就可以了。那这个这这句话表示什么意思呢?我这里说一下就是绑定。哎,绑定一个端口。并且同步处理。并且同步。同步华哥生成一个什么呢?它生成了一个。
22:00
China for future对象。至于这个China future对象是什么,我们后面再详聊,你可以简单的认为它的这个地方会立马返回。也就是说这个地方办的办的一绑定过后呢,它就返回一个这样的CF对象,这个CF对象呢,我们可以通过后面呃呃,后面再去读取它返回的一个结果啊,这个China future对象。那这个说完了以后,下一步呢,我们就还要做一个动作,就是干什么呢。对,关闭通道。关闭通道。呃,就是对关闭通道进行监听。二进行监听。好的。那这句话应该怎么写呢?就CFCF点。Channel,拿到这个channel.close future,注意看这句话。点SYNC。这句话呢,现在大家不太好理解,诶有些同学说老师你这一绑定启动这个地方其实就是启动了啊,就这这个地方就相当于启动我们服务器了。
23:11
这里就是启动服务器。啊,因为他他绑定绑定的端口,并绑定端口了。那有些同学会想,诶,你在这地方刚刚把这个服务器绑定端口,然后启动了,你怎么马上就去关闭了这个通道呢?注意大家一定要注意看到这里它是对关闭通道进行监听,而且它是close future,什么意思啊,就是当你有这个关闭通道的这个消息或者事件的时候,才会去进行这样一个处理,不是说我们这一启动马上就去关闭,不是这样子的。那么这里面呢,涉及到一个机制,这里面涉及到ni的一个什么机制呢?就是我们后面要讲的这个机制。大家可以看一下,在后边有一个异步模型。这个异步模型里面这个China future,我们会给大家说一下,这里面现现在呢,我们先继续往下编写哈,因为把代码写完了运行起来再去分析才有道理,如果说我这个代码没有运行起来,我讲半天大家也也不知道老师在说什么。
24:16
对不对,好,这是服务器这端的第一个就写完了,但是大家有没有发现我在这地方有写,对有没有写这个功能呢?是不是我们这边应该是有要求的。你在这儿?在这你是不是还没有去处理接收客户端的。呃,数据也没有发送消息给客户端,那这种事情会让谁来做呢?同学们,这种事情呢,会让我们这一个圈关联的。的一个handle德尔来处理。这个有点绕,大家不要着急,一会代码写完了过后老师1DEBUG,你马上就会对他有一个认识了,你现在先认真的听就行,好,我说了ni这个这个框架呢,呃,它主要是隐藏的东西太多。
25:09
它是在原生的Java,它在原生Java IO上面封装了一个NIO,这个这个模型,又在NIO模型上面加了这个ni,而且他对那个呃,我们叫主从reactor模型呢,进行了一个改进,所以它里面风中的东西是特别多的,一时半会呢,你是看不到它的底层的。好,嗯,那现在老师刚才讲了,因为我们在处理整个这个模型处理的时候,它其实是靠这个pen拍烂里面的这个圈,这个handler来处理的,那么这个handler呢,你可以,嗯,这个ni提供了很多自自他已经提供了一些,而是就是现有的handle,还有一些handle呢,你也可以自己写,现在呢,我们自己写一个handler来接收客户端发送的消息,并且发送消息回。
26:01
回给这个,那这个地方应该怎么写?同学们跟上老师思路。
我来说两句