00:00
下面我们再讲一个关于bit,呃,Buffer就是我们buffer和China的一个注意事项,就是什么呢?就是我们所说的,呃,Scatter和这个,呃,Scatter和这个getttering scattering和getttering,这两个是干什么?这个叫做这个叫做分散,这个呢我们可以认为是叫做聚合或者叫合并都行。什么意思呢?就是我们前面讲的读写操作,其实整个呢,都是在一个buff法里面玩的,那么NIO它还支持通过多个buffer及buffer数组完成读写操作。比如说我们数据比较多,那么你如果只有一个buffer呢,其实来回切换比较次数就比较多,我们也可以用什么呢?我们也可以用多个buffer来完成数据的读写,那现在呢,我们直接给他举例说明它的这个分散和聚合是一个怎么样的形式,写个案例。加va好,现在呢,我们直接写这样一个名称哈,就叫。
01:01
挖掘名称写到这儿来。Y。And。按照这个。Scattering和这个gathering。放这啊,一个test。下面呢,我们来走一个代码。走一个代码。方法,那现在我们怎么来举例子呢?首先我们先对它这个概念做一个基本的说明,我们先说这个cattering,它表示什么意思,它表示的意思是在将什么呢?在叫做将数据。将数据啊写入到这个叫写入,写入到这个buffer时。八份十它可以干什么呢?可以采用采用八分数组。Buffer数组依次写入,注意听这个啊,依次写入,什么叫依次写入呢?就是一一个buffer满了,再写到第二个buffer啊,就依次写入,我们再来看这个。
02:14
GY。这个表示什么,这个我们就称之为分散啊,这个就称之为分散。分。分享。好,那gathering它表示的意思是什么呢?就是再将再将这个数据读入到。诶,再将这个数据读啊读出,这叫读出。读出就读,读出到从这或者说从这个buffer读数据的时候,这样写是不是更好一点啊?教练说从buffer读取数据时。一个是写进去嘛,现在是读嘛,读取数据时。数据是可以干什么呢?它也可以采用八本数组。
03:02
也可以赞同。然后干什么呢,依次。就是按照这个顺序依次读写读啊读。一直读,如果第一个读了过后呢,读完了过后再接着读下一个啊,读下一个就这个意思,那现在大致的意思明白了,过后我们就来开始走这个工作了,这次呢,我们换一个方式啊,这次呢,我们就不再用文件通道了,大家还记不记得我们在前面讲这个通道的时候,其实这个通道类型很多啊,啊通道类型很多,我们这次呢,用这个通道,我们给大家说一下,用这个serve socket通道,我们这次换一个方法,这次使用。我们使用什么呢?我们给他演示的是。Server socket channel。和什么呢?和这个server socket channel和socket channel。Shocked channel driver,那显然这个地方就涉及到一个网络了,也就是说我们现在呢,呃,要演示的效果就是这样一个情况,我画个示意图,因为你不知道我在说什么,待会咱们沟通起来,你你可能不知道老师在说什么事情啊,比如说我们这有个server,诶我们就干脆不画了,我们就用上面这个图。
04:20
还是用上面的图,待会呢,我先让这一个server在这进行一个监听,对听,Server在这边进行监听,呃,监听的时候呢,如果监听成功,就让这个server soet channel给他分配一个so channel,明白了吧,明白过后呢,我现在呢,待会我从这个客户端就发数据,呃,当然我是发数据,可能是先这个放到这个buffer里面,Buffer呢再传给这个channel channel呢再放到我们这个服务器,是这样子吧,再给到我们服务器,呃,这次这次呢,我们在这一个服务器端,我们整。多个八分。啊,我们再整多个buffer,就是这边其实在读取的时候,这边也会有8UFFER啊,因为我当时讲的时候呢,只讲的客户端,我没有说服务器端,服务器最端它也会存在8UFF分明白这意思吧,好,这样子呢,就把这个知识点就补齐了,我们前面讲的是在客户端程序,其实当时我们应该是讲的单,呃,不是涉及到网络的,所以说我就是按这个方式来说的,现在呢,这个程序你就要理解到在读这个China的时候呢,这个是服务器来读的,它中间呢,也会有一个什么呀,Buffer,明白这个意思了吧。
05:32
好,那待会这个buffer是读的时候呢,我整的是一个数组,不是单个buffer了,是一个buffer数组。呃,就简单可以这样理解,就是待会儿我们在操作的时候,这边地方我不是一个八分。而是多个buffer。多个buffer,你看我是怎么操作的好,明白这个道理过后,我们现在就可以写代码了。首先第一步我们先来创建一个server soer。Server怎么创建呢?D open。
06:05
哦,这是我们第一次用server so channel来写代码,就写个server channel。我把这边挪一下。这边呢会抛出一个异常,还是老规矩,这次呢,我们简单一点哈,我们直接把它扔出去。后面我们再说补货的时候又怎么补货,拿到它了以后,下一步我们干什么呢?好,下一步呢,我们再来创建一个server address61个。In,这是看看应该怎么写呢,叫in need。然后我这边绑定一个地址,比如说7000。好的,我放一个地址进去,然后这边我们就用。好,然后下一步该干什么呢?下一步我们这样写,绑定。绑定端口。绑定端口到。绑定端口到哪里去呢?
07:01
诶怎么写在这了,绑定端口。到socket。到并启动。So,并启动。并启动好,这这个方法咱们应该怎么操作呢?是这样写的,Server socket。点socked.band把什么绑定进去呢?就把刚才我们写的这个地址啊绑定进去。好,这时呢,它就处于一个启动状态,启动状态呢,我们现在呢,就来创建什么呀,我们创建一个buffer数组。Buffer数组,所以这这个时候我们写的是服务器端哈,这边你可以理解理解成是一个服务器端,也就说我在服务器端呢,创建一个buffer数组,创建buffer数组当然很简单了,那就BAT我们用。败数败8UFF分字节八分。创建几个呢?咱们就创建两个。
08:02
创建两个生成,好,这是我们BAT buffer数组得到了,拿到这个数组以后,我们就来分别把它两个数,呃元素创建起来,第一个我们分配一个空间。But。好,我们应该用代词。BA buffer。诶,这个怎么这么长。写错了啊,Bye。八分。然后呢,老我们第一个分配五个空五个字节。啊,第一个我们分配五个字节,第二个来了,第二个呢,我们分配三个字节,为什么我要这么去分小一点呢?因为待会我们想让大家看到他这个buffer是怎么依次写进去,它又怎么依次读出来的,好这样子来比较,那这个拿到以后,下一步呢,我们就开始监听。啊,就是接等待等待客户的客户端连接。
09:05
待会呢,我们仍然用tonight来玩,好吧,我们还是用tonight来玩。走起来,那现在怎么走呢?server.accept他一旦accept成功,我们就拿到一个。Socket就socket China,也就是说这个一旦成功了过后呢,我们就相当于得到了这个socket China,那当然这个China呢,就跟我们服务器关联起来了,明白这意思吧,只现在选择器我们还没有引入。现在是相当于是一,你可以理解成就一个线程给一个客户端进行交互,呃,多线程多客户端,我们一会儿再说拿到了,拿到以后下面我们该干什么呢?显然是循环的读取。循环的赌局,因为我不知道你通过就是你这个客户端是呃,发了多少个数据过来,所以说呢,我就一一步步的走,那现在我用一个Y循环了。
10:00
赵处。好的。那这个处在操作的时候呢,我们先来统计一下它到底读了多少个字节,待会呢看看够不够哈,零。好,接受下面这句话,用while循环写Y循环怎么走呢?如果我们这个BY。就是我们读到的这个接数,它不够几个呢,比如说我们假定啊,我们假定待会呢,最多接受八个假定,我们接受八个,所以说我在这写一个变量,比如说叫message。我们我们为了做测试呢,假定待会我们最多接受八个啊,待会主要是看他是怎么做,因为我一个空间是五,一个空间是三嘛,如果我只我只是用一次的话呢,我做是不是我最多就读八个嘛,我们假定。好,我们假定接收。从客户端这样写啊,从客户端接收八个字节。
11:01
八个字节能能理解我意思吧,因为我在这做实验,所以说我就假定就八个字节。待会主要是看这八个字节,它是是不是先放到第一个,再放第二个就是看这个。好的,它只要是小于它,我就干什么呢?我就可以继续不停的读,是这意思吧,好,那我就这样操作,咱们怎么读呢?好,显然我要通过socket China来读取了。Read。Read读读的时候,这个时候我们应该把数据放在我们这个buffer里面去注意,这时呢,因为我这个buffer是个数组,所以你就放进去就行了,他会自己去知道怎么去分散到第零个,也就第一个,第一个啊buffer还是第二个buffer,所以这个地方它会有一个相应的操作达到以后下面呢,我们就把它加起来。就现在我读取到多少个了呢?等于R,因为你这边会返回一个值,就是同学们看。
12:03
就是你在read的时候呢,它会返回一个读取到的个数,对,我把它呢加进去。啊,累积,这不就是累积,累计读取的字节数没问题吧。好,拿到这个自建数以后,我们就可以说一下我们现在读取到的自建数有多少个。我就打印一下好吧,我们说读到多少个呢?BY就by read现在读了多少个。输一下。等于多少呢?现在我把它数出来就可以了。好的,那读起来以后,现在你读取到这个个数,我我也想顺便把它这一个相关的位置达到,因为我想看他在读的时候是放到这个buffer的哪个位置了,我想把它输出来看一下,就看一眼他现在的limit,还有它的position的位置,好我们现在看看此时此刻。
13:01
输出我们用什么方式呢?使用流流打印。这个流打印有同学应该是学过的吧,我们就使用流打印。使用流打印,好流打印呢,我们来看看。看看当前的这个buffer,这个buffer OK buffer的position。和limit米特OK,这这浏览力怎么做呢,怎么用呢,二。这是需要有点Java基础的同学们,我这里就不去讲它了啊,如果你这有有点没有搞明白的同学们,自己自己再去看相关的资料了,我这不说了,把我们的buffer放进去。对不对,这是数组,数组完了后呢,做成一个流stream。Stream,再点map。再点map好的。Map里边呢,我们就开始来取出每一个buffer了啊,这是取出一个buffer走。好的这边呢,我们就可以输出它相关的信息,比如说我们说position。
14:05
Position等于多少呢?加一下,加下我们就取出这个八份,现在这个八份的position。是不是我们是不是说这地方是可以取出来的position。好,调这个position方法就可以拿到,我们再输出当前这个buffer limit等于多少跟上老师思路。那么你的这个buffer的limit呢?我们选择调这个limit方法就可以拿到了,待会做一个比较。然后拿到以后,我们顺带呢把它输出,怎么输出呢?用这个for each,用流的形式来输出system。什么点out?啊,流行式,然后也能。好,写完了。那那写完以后,我们看这边会有一个什么呀,他说这个使用呢,是需要在1.8,那我需要把我的编译器啊,我看一下编译器的问。因为现在编译器呢,可能是我还用的是1.5来编译的,我就把它改一下就可以了,来找一下。
15:06
呃。在哪里呢?看一下啊,应该是在这个位置吧。编译器,然后找到我们Java comp,现在用的是1.5,我换一下。它默认是整的1.5,我们改改一下就可以了。好,改完了之后这边没还是没变化,那就还得找一个地儿了,就是哪里呢?就是project structure。这地方还要做一个修改。嗯,我们看是不是这个地方啊。Module,好,就这地方还得改一改,那这个源码可能没有改过来,对,应该把这个也改一下,改成我们的八好支持相关的语法。应用一下。确定确定过后这边呢,就没有错误了,对吧,同学们在你用的时候呢,有些项目呢,它默认它还是用的是5.0,或者是其他原因,你把它改一下就行了,这不是大事,好这边就看出来buffer的情况了,那这个时候我们继续还要写,还要写什么呢?因为你现在只是读到了,读到完,读完了过后,下一步我们应该怎么做呢?继续啊,继续继续往下走。
16:16
这个while语句接着往下走干什么呢?现在我们将所有的。所有的buffer。Buff分进行一个反转,为什么要反转呢?因为你将来有可能就说你不是,呃,你做完了过后,你可能将来还会你你是读你那还输出呢,对不对,你读你把这个数据拿全全全部拿到了,你还你还要输出,或者还要做其他相关的操作,我们还要做一个反转那。点as list还是这样操作一下就可以了,Buffers。点什么呢?点for each。For each,好,我取出。每一个buffer,然后做相关的操作,怎么操作呢?每一个都反转一下就是buffer。
17:03
点。什么样?这样就完事了,就是我处理的时候呢,我要把它进行一个相应的反转,反转完了过后,我们来看一下下面的代码,继续写哈,继续写,下一步在干什么呢?将数据。将我们的数据。读回读出啊,读出读出,然后呢,显示到显示到我们的客户端。因为我这处理完了,我还想把它显示回我的客户端,那显示到这个客户端的话,我怎么做呢?还是老规矩,首先呢,我们看我们先定一个变量来控制我们回显的它的大小,比如说默认为零。好的,默认为零。当然我建议地方用个Y循环来进行一个回旋,只要我们的这个bit right。它小于了我们定义的这个大小,那么我们就可以不停的去做,因为因为你将来这个数据可能很多嘛,对不对,所以说我用一个Y循环来处理,怎么处理呢?大家看反过来操作了这个server so channel,现在现在我们的so china.right了。
18:17
诶,你原先是read,大家还记不记得你原先是从这是read。就是把你的呃,这个通道的数据放到这个buffer,现在呢,我们要反过来错把它写入到这个buffer了,明白这个意思吧,诶,Buffer。把它放到我们这里面去。其实呢,这个地方就是一个回送好的,这边写完了以后呢,我们把这个bit b right。干什么呢,加一下同样道理,因为你这边处理完了过呢,也会返回一个值。是不是L?那么我们把它累积一下。累积一下,只要它小于message,我们就TH啊。
19:04
基本单词写错了。TH。我把这个修改一下。回到这边来。这边定义呢,咱们也把它改一下就可以了。好的,这是回旋到客户端,回旋到客户端以后,同学们下一步我们做什么事情呢?诶你不要忘了一件事情,我们回旋完了过过后把它回去过后我们是不是还要复位啊,就是将所有的bber。B干什么呀,进行一个可令操作,原因是不在前面已经讲过了,你做一次你就。进行一个肯定,不然的话后面肯定会出问题,前面我们已经分析过这个事情了,同样道理,还是用流的方式来处理,点S。类似,然后呢,我们还是把这个bad buffers取出来。然后点for循环一下,循环的时候仍然是八分啊。
20:02
Buffer,然后呢,走走的时候我们这边怎么操作呢?好包起来,取出来过后,我对每一个buffer都进行一个clean。都进行一个颗粒代码就OK,最后。完了过后,我们把这个数据再输入,就是你在这个地方操作的时候一个情况是什么,比如说我们bit read。好,等于把输出一下啊,我们看我们一共read了多少个。再加上再加上我们一个bit right。也把它赎出来。Right等于多少呢?Bit right这个词。对不对,还有我们整个数据大小是多少,也输出来一下。EE认识。是不是输出来就行了,看一下好到此呢,我们这个小程序就写完了。
21:00
对,这个就写完了。当然了,最后呢,呃,按照这个操作流程,我们来试一下,看看它到底是个怎样的情况,好吧,是个怎样的情况,是不是我们发送的时候,它能够把这个数据分别放到第零个和第一个相关这个buffer里面去。那么我们来运行。来运行一下。运行起来。好。这时呢,如果没什么问题,他应该是在7000这个端口进行监听,好现在呃,没有输出,因为我我这没有没有去做。输出的控制,那现在呢,我们仍然用tonight来玩一下。127.0.0.1连接端口7000回车。好,然后呢,我们往里面发数据了,Send第一次我发大家看啊嗯,现在因为他一共呃,按我这设计呢,我要接受八个字节,这次呢,我故意发送的,发送六个字节,不不到八个,你看他会怎么怎么放,好我先写哈。
22:09
A、回撤。好,我们可以看到他在这里呢,一共从这边拿到了六个字节,然后第一个八分。它是position和limit,一个是五,一个是五,也就说他先把第一个buffer里面,呃放好了,就是先把我们数据先放到我们的第一个buffer里面去,然后再放第二个,而第二个呢,跑是一,它最多存放三个,也就是说你六个呢,你看一共六个嘛,123456对不对,然后我还把回冲数据给他拿到了。那现在呢,我们再来玩第二次,第二次,那在玩第二次的时候呢,我们为了看这个效果,我把这个关闭一下哈,关闭一下再来看这个效果。这次我们看会怎么样,兄弟还是按照刚才这样操作一下来启动。这次呢,我刚好就发八个字节过去看效果。
23:00
TONIGHT12 7.0.0还是我们的7000没有问题。现在我们发送数据给他发刚好八个哈ABC回车,那这次呢,我们可以看到,诶这次你看第一个buffer它。用完了就是position和limit相同的,然后呢,第二个buffer呢,三和三也是一样的,所以说通过这个小案例呢,我们其实想表达的一个意思就是说将数据写入到或者放入到buffers,可以采用buffer数组,它可以依次写入叫分散,那么他在读取的时候呢,诶,他在读取的时候,它也可以从用buffer叫依次读,这个呢我们叫做怎么样叫聚合。就是这个意思,那这个有什么好处,好处就是在于。如果说将来我们在进行这个读写这个buffer的时候,一个buffer呢,太不够用,咱们可以整成一个数组的形式,让他呢,呃,操作起来更快捷一点,就这个意思好吧,好同学们,那关于我们这一个,呃。
24:11
Buffer,呃,它这个NIO支持多个buffer进行读写操作呢,我们就说到这里。说到这里,好的,那这讲我们先到这。
我来说两句