00:02
快速入门实例的第二个。我们使用来开发一个简单的HTTP服务。简单这样讲,好。呃,Nit服务器端呢,他在6686668端口上监听浏览器发出请求,比如说他在浏览器输入了这样一个地址,LOCALHOD6668。服务器回复消息给客户端说,Hello,我是服务器,对吧,我是服务器。并且对特定请求资源进行过滤,因为我们知道在默认的情况下呢,默默认的情况下是不是我们发一个请求的时候呢,会顺带要要把这一个网站的这个图标也下载下来,因此呢,在默认情况下,其实你发一个请求会请求两个资源,一个是这个文本,第二个呢,就是那个图标,我们要把那个图标。给它过滤掉。
01:00
这这个实例的目的就是让大家体验一下nit怎么去做HTP服务,并且需要理解handler实例与客户端及其请求的关系。我们前面讲的handler呢?是讲了一个自己写的,那在这里呢,我们要引入两个handler,一个呢就是net,呃,自带的handler,还有一个就是我们自己业务处理的handler。好的同学们,那现在呢,需求我们已经说完了,下面我们开始走代码。我们在这里新建一个包。我们新建一个包,走一个叫做ninety。点什么呢?HTTP。我们首先创建。我们的server,我取个名字哈,就叫test server。美的吧?Test server。第二个呢,第二个我先把这个架架好,服务器端我们不用开发了,因为服务器端用的是浏览器,第二个呢,我们肯定要建test或叫HTP都可以,我叫test test http server handler,这是我们自己的。
02:14
这个韩德尔呢,将来会去接收。接收回接收信息和发送信息。这是handler,还有一个呢,这次我们要改编一个写法,大家还记不记得我们在前面写的第一个案例?我们把handler是怎么加到我们这个,呃,这个拍online里面的呀,是不是在这里加的。我们在server这端呢,在这里直接这样做的一件工作是不是。在child handler的时候,Child handle的时候,我们在这里直接溜了一个China initializer,然后在这里面呢,通过init圈的方法,把我们的自定义的handler加到。我们的管道里面去,但这次呢,我们想把它提出来,明白我意思吧,就是现在把老师高亮的这一部分提出来,单独的写一个类,这样管理起来呢,也是比较方便的,但两种方式都可以哈,两种方式都可以,我两种方式都给他写一下,所以这次呢,我们要要把老师高亮的这一部分单独的写一个类,好,我把名称写好。
03:20
这个类呢,名称呢,我们就叫test。啊,Test。就叫test server吧。Server什么呢,It?I。Nature。对吧。Server initialize就是test server initialize。好的,那么我们先写第一个server端。写上它的主方法,跟着老师思路,嗯,前面的几个步骤其实是大同小异的,所以老师呢,就不再多说。好,这两句话拿过来好吧。把这两句拿过来。把我需要的东西拿过来,然后呢,我们就用一下。
04:02
对,还是我们的串。踹完了功能,这有的finally。Finally里面我们有相应的关闭,先写好这些都可以,先写好的shutdown Grace,然后呢,Worker group也关闭。我们这边呢,会有一些异常,异常我们就直接怎么样扔出去就完事。下面呢,我们开始编写踹块里面的内容,踹块里面的内容其实大同小异,我们的部分,呃,大同差不多的东西呢,我们就拿过来好吧,首先第一个我们是不是人要创建一个。啊,Server bootstrap用于启动我们的服务器,好的,那下面代码呢,我们就开始继续往写了啊。Street。点group。干什么呀?加入我们的boss group,还有我们的worker group2个线程组点。是不是指定我们这个channel将来的一个实现时间类型I。
05:04
IO什么呢?IO?接着继续往下写。啊,这个写完了过后呢点呃,下面我们来怎么走呢。好,下面直接child handler哦,我们这次就不去配置其他东西,就使用默认就child handler呢,这里面我们先写一个空。啊,我们这次呢。刚才老师已经说了,这次我们在加入给我们管道加入handle的时候呢,我们用这个自己写的。呃,自己写的这个server initial来完成,好吧,好,下面继续往代码写完。下一步工作是不是就该绑定端口,然后启动我们这个服务,是不是,那就是我们的boottrap,那这个名字呢,咱们叫server吧。这边我们叫做server。这样名字看起来好一点。
06:00
Server boot drive,因为我们客户端还有一个呢,这个名称呢,就区分开来了点什么呢?B绑定我们的端口是6668,是不是说好的668。然后呢,给他做一个异步处理。VR。返回一个China future,是不是已经讲过这个事了,对,然后China future下面是不是对关闭,呃,我们这个China进行一个监听。那这边写的是点channel。DA close future。点异步处理。好,这一句叫代码写完,那下面呢,我们紧接着要写的就是这一部分,就是老师刚的这个诺诺,这一部分呢,就是待会我们要写的。呃,自己的server,那现在开始写这部分,那在这一部分之前,同学们想一想我们应该怎么做呀。是不是首先要继承?继承什么呢,China?
07:00
哪一个呀?China。这边没有提示哈,没有提示的话,我们就自己写一下。就这个。好的,那这里面我们是不是要写上,呃,这在这个China里面我们使用的这这个就是在这个我们使用的是哪一种China。Socked。Shed China。那接着继续往下写,里面呢,我们需要重写一个方法,这个方法呢,还记得吧,就是我们的it这个。It China。那在这里面我们是不是就开始去向什么呢?向管道,管道加入加入。这个处理器。处理器好的同学们,我们这次讲的是对,就是说我们这边呢,有。我们的浏览器发一个信息给我们的server,那首先我们先先加入一个就是编解码的处理器。
08:07
首先我们第一步先得到得到管道。得到管道。得到管道呢,非常的简单,就用这一个short channel.pipeline。PI。C点。PI。看这地方为什么没出来,这应该没有引包哈。So etern。Shed China。Shed China,我们看看这里是不是引错包了。刚才。重新移一下。对,重新一下。那么我们这个地方引的应该是哪一个包呢?是这个包。大家写一下,大家有个印象啊,l.net.channel。对吧,点channel。
09:01
啊,点那点China点什么呢?OK,再是我们的shocked点什么呀,哪一个在哪里,在最下面的一个socket圈,哎,这样才对的。这样才对好,我们现在呢,再来获取就没有任何问题了,拍拍单拿到拿到功能我接收一把。这就是排量,拿到排版量过后,我们下一步呢就加入。加入一个nit提供的ni。提供的什么呢?这个HTTP叫做HTP。哦,口袋。这个就是编解码器的意思啊,就是其实这个单词的缩写是口袋,我说一下这个单词呢,其实它是code。啊。Coder和这个还有一个decoder啊,Decoder的一个缩写啊,就是这个口袋,就是说的所说的他提供了一个呃编解码器,好编码器,那那么怎么加进去呢?pipeline.add next。
10:08
对,那么我们直接加,加的时候呢,我可以取个名字,我们以前是不是这样加的,是不是六一个STP。HTTP什么呢?Server。口袋其实前面呢,我们可以取个名称,如果你不取名称,它使用的是默认名称,对不对,所以说我们再写第这一种新的写法,或者说大家见一下,取个名字就叫MY。Http server口袋。同学们,这个东西是用来干什么的呢?我做一点简单的解释,教同学们看这个。它的作用。说明。对它的一个说明。他是干什么的呢?这是我们nit提供的一个基于HTTP的编解码器。是netty。Ninety。呃,提供的处理什么呢?HTTP的编解码器。
11:05
编码解码器。那么我们来简单的看一下它的继承关系。往这走,同学们看到。是不是他?那如果说呃,就是htp server口袋,我们往里面追一追,从他的继承关系,我们可以看到它是怎么来的呀,你看它是不是有这个HP request decoder。还有一个htp response encoder,就是它既有这个,这个是解码,它也有编码的,这这这个继承的关系,就是这些呢,它是可以,它既可以做编码,也可以做解码,那下面呢,我们再往里面追一追。往里面追,他到底是怎么处理的?我一直往里面追。追到这里面去了。追到这儿来过后呢,继续往下面追哈。二六。又一个D,呃,走,往这边去。
12:00
得到这个it。It从这追的这追。好注到这里面去做到这里面去有个super。好,再往里面追看,这已是个htb request,继续往里面追。最终呢,我们追到了一个HT object,是不是在这边再追一下。哎,同学们看这里面是不是得到一个HP,哦不,这个decoder,然后这里面呢,它就追到这来了,再往下面追的话,就追到这,这里面有什么呀,你看。是不是最终我们找到了na passer就是解析,呃,解析器,还有一个hier解析器。这边就他会对我们传过来的这个HTB相应的数据进行解析,那回到我们前面的地方继续走。这是nit提供的要处理ATP的呃,编解码器。那接着呢,我们是不是要加一个自己的,我们再增加一个什么呢?增加一个自己的,自己自定义的吧,自定义的什么呢?这个处理器。
13:04
还德尔。好的,那现在我们是不是应该写哪个了呀?同学们是不是应该写这个东西了。这次呢,我们又换一个写法啊,同学们要建多一点,我们原先是继承的是什么呀,是不是继承一个channel。介绍了一个这样的东西。A channel。In bond in bound hung adapter,这次呢,我们换一个,换成这个东西,大家看一下symbol。哦,Simple。申报什么呢,China?China ebo。呃,Handler用这个东西来做。那这里面呢,我们要写上一个类型,这个类型是http object,我解释一下。好,但是下面呢,有相关的很多方法,我们来走一个,就是这边我们是simple channel inbound handler,然后这边是指定的什么呢?指定就是我客户端和服务器端,他们在进行处理的时候,嗯,他的一个数据类型,这边我们是有什么东西没有实现是吧,来走一个。
14:12
它实现相关方法,至少这个方法叫channel read0要进行实现。好,OK。OK,要要做一下,那这个呢,其实这个方法仍然是我们以前所说的啊,就是当有读取事件的时候,就会触发这个东西,这个这个函数。这个是干什么呢?就是读取。读取客户端数据。好的。那这里呢,我多说几句,针对这个地方我多说说几句。呃,第一个同学们看到的这个simple China inbound,其实它是谁的子类,我们看一下啊,叫他是什么呢?往这儿追一下。说一下它的代码,其实它就是我们原先写的China inbound handler adapter的一个子类是不是,所以大家明白这个关系了吧,也就是他的只说他提供的这些方法呢,应该更多一些。第二个。
15:10
第二个我们再看这个东西是什么,就是htp object表示什么呢?OK,它表示的是啊,表这个类型啊,就是表示的是什么呢?表示呃。表示这个客户端,客户端和和和服务器端。服务器端。干什么呢?他们相互相互通讯,通讯的这个数据啊,数据被怎么样封装成,封装成什么类型呢?这个http object的类型。啊,所以说你看这里,他这直接就把这个MSG呢,就给你对应成htp object。那你在取的时候,取的时候呢,就不再是一个简单的object,而是直接以这种htp object的形式来进行这个传递。
16:04
好,接着继续往下写。嗯,那下面呢,我们就来准备接收,准备接收的时候我先判断一下,诶,我判断一下,因为。这边有很多信息,我们判断。判断什么MSG?是不是一个HTTP的请求。那怎么写呢?非常简单,就msg instance。这里面还有一个类型叫HTTP什么呢?诶,就说如果你是一个HP request请求,我就做下面相应的处理,下面相应的处理我做哪些处理呢?首先我给大家看几个信息,我们看MSG它的类型是什么啊,就是我们这做做一些输出输出的工作,M SG GA class。但你也可以bug,紧接着继续往下面写,我们想得到客户端的地址,我就说客户端的地址是哪一个。
17:00
或者叫浏览器的地址都可以。客户端地址,客户端地址又怎么去获取呢?是不是前面我们也讲过了,通过这个点去了。点地址就可以拿到,紧接着我们继续往下写。同学们想一想哈,我在这里想想去,就说你就说这个浏览器向我请求。请求一个数据,其实他首先是发了一个HTTP请求,然后我在这就可以给他回复一个信息了。我怎么去回复呢?我准备这么回复,现在回复信息给浏览器。啊,回复信息给浏览器,大家想,如果你要回复一个信息给浏览器,你是不是必须把它做成一个HTTP协议的这种形式才可以回复,你不能简单发一个,发一个文本呢,不像我们前面写的TCP协议,你TCP我发一个,呃,发一个这个字符串就可以了,但是浏览器呢,它要满足是HTTP的这种协议,因此呢,我要开始做这个工作,怎么做大家看。
18:04
嗯,首先呢,我们先去创建一个BY的八份。Bit buffer,好,大家看我一步步的来啊,我们这里面用的是ne bad buffer,好,就content吧,这是我返回的类数据,那么我就用过非磁化的。啊,点copy buffer,好的,我写一句话叫做hello。哈喽哈喽,我是服气。我是服务器理解哈,那这边呢,显然我这边要做一个编码的处理,Char set,这个是不是也用过了char set u t。让他指定编码的方式是有点。大家跟着我的思路写就行了,并不难哈。第二个,现在我们要干什么呢?下面就要构造一个HTTP的响应。响应急急什么呢?就是HTTP这个response。
19:01
Response。那怎么做这个事情呢?也非常的简单,六一个devot这个来提呢,它其实我们前面讲过来,它是支持HTP协议的,所以它有相关的这些类和接口来做,叫什么default。怎么回事,这个。D。一写怎么就卡着呢?Yeah。等一下啊。六。六。诶,我打一个D他就完蛋了,这可能是我刚好是有一个快捷键给他给他冲突了。啊,快捷键跟他冲突了,这个我输一个大写的D,他马上就不停的给我。那这个怎么弄呢?我看一下啊,看一下default。这个要写大写的地才行。
20:05
输入。六一个D,大家看这个单词比较长啊,Default。Default什么呢?就是我们负。负对,大家看这里面有个负,HTTP什么呢?Response。Response,这样构建起来还是很快的,然后首先我们要指定它的版本。HTTP什么呀,Http version。我们用1.1这个版本返回,然后后面呢,我们要指定它的一个状态码,HTTP什么呀,HTTP,然后response。Response。这个呃,Standards这边我们写一个叫点一个什么呢?点叫OK。OK,好,这这个码就是代表我们的返回的码是200,状态码是200的,大家呃,会HTP协议的同学应该清晰哈,这边是我们IP协议的版本,这边是他的一个状态码。
21:06
那这个整完了过后,下一步我们要做一件什么事情呢?好,把内容给它放上去,就content。对,刚放进去。这边会返回一个什么呢?来看一下,会返回我们的一个对象,我们就叫HTP,我们就干脆就叫response吧。Response没问题,那这边名称哈,我们就用这个for,这不用这个全身了,就用它类,这样接受也是可以的,For h GB response,那下面呢,我们还要设置什么呢?我们还还还要设置一些其他的信息,response.set。首先呢,我们,呃,对对它的头设置,所以说我先要得到他的头head.set。那我们下载他一些信息进去。呃,首先我们看给他设置一个返回的类型htp hi。
22:01
Hier hi,我们把这个名字给它放进去,Hier head。ER。呃,Name。点什么呢?Content。这个。Count。Content type。下划线。Type。就它好类型呢,我们指定我们是文本的形式,文本的是不是我们是TXT,然后呢,Play。好,写完了,紧接着我们继续还要设置his。点set。啊,这次赛的呢,仍然是我们这个投HTTP。Httper。对,点什么呢?好,我们还要设定一下返回的长度,就是content下划线。对不对,那长度是不是就是我们这边要返回的content的长度,我们把这个content程度呢,给他填入进去就可以了,怎么写read able。
23:08
Bits。放进去就可以了,就说我们要返回的呢,其实就是对它的一个readable bits进行一个返回,那长度呢,也就统计出来。好长度统计出来,下一步我们就可以发送了啊将什么呢?将构建好的构建。构建好的这个。Response,返回。是吧,那返回的时候是不是我们仍然用我们这个上下文点right and flash把它放进去呢?直接扔到我们这里把response返回就可以了。好同学们,这个呢,就是我们这一个服务器这边的一个代码,就是一个最基本的写完,写完过后不要忘了一件事情,这个handle是不是你还没加进去啊。你没加进去,加到哪里呢?加到这里面去看到没有,所以说我们要增加这pipeline.add。
24:02
走,同样我们也可以来取个名字,六一个。Test。Test,呃,我们叫做test hb server handler。同样,我们也给他取个名字吧。取个名字前面呢,加卖就是我的test http server handler加进去了,呃,好,那这个这些把它加进去,完了过后不要忘了还有一件事情,是不是要在server里面把我们这个。呃,就是handle的对象,给它加进去,又一个什么呀,又一个什么就是test server。Test server。Initize。这样就OK了,也就是现在呢,我们这种用法呢,其实就是相当于把原先写的这一部分代码,就是以前我们写的这一部分代码。哪块呢?就老师写的这一部分代码,把它单独的拿出去做了一个类啊,然后呢,把这个类的一个对象给它放进去,那这个把它放进去过后呢,在这个initial light里面,我们对init channel进行一个处理,然后在这里拿到它对应的channel,然后的管道,然后把它相关的。
25:14
什么呀,Handle放进去,好,同学们。同学们,我们这个最简单的,最简单的一个。嗯,HTP服务就写完了他呃。他收到一个。就是浏览器发送的请求以后呢,怎么样,他就去返回了,一句话叫哈,我是服务器,我是服务器好,我们来看看现在代码是不是能够运行起来。运行起来,我们来试一下。好,先运行我们的这一个。服务器端。运行完了我们再说其他的问题好吧。来看一下。好运行起来。那运营起来过后呢,现在我们打开一个浏览器。
26:00
啊,我把这个关闭一下,应该以前打开过一次,我关闭。打开一次。打开打开以后我们输入呃,地址http local host什么呀,六六。六八回撤。回收过后呢,我们看到一句话哈,我是服务器,我是服务器,也就是说此时此刻一个最简单的这个就OK了,但是我们发现很奇怪的一个事情发生了什么呢?大家有没有发现我把这个清掉。大家看啊,各位朋友。我刷新一下这个页面。你会看到,诶,怎么我们的浏览器这边发出了两次请求呢。大家看到是不是他发出了两次请求啊?两次请求,而且从这里面我们还可以看到,刚才老师在这儿不是说了一句话吗?我在这给大家看了一下,就是我们这个mst真实的类型,其实这个真实类型就是什么呀。
27:02
Default http request。对不对,它真实类型是的,那这个肯定是要么是他的一个接口,要么是他一个类,可以看一下。好,我们看一下。大家可以看到是不是H这个h htp object其实是个接口,对吧,它下面呢,肯定有个debt htp request,看一下是不是这样子的。到底是哪一个呢?对。看这里是不是这里有一个default。呃,往往下面再找吧,应该是request,应该往这去找,大家看这里。是不是devot htb request,也就是说它真实发过来的对象是,对象的类型是他,但是呢,走的接口,统一的接口都是htb object。好,同学们,那待会儿呢,我们就要去分析为什么会发出两次请求,又如何解决?那这一讲,我们先跟大家聊到这里。
我来说两句