00:00
说完缓冲区八份,我们现在讲它的第二一个核心组件。通道channel。那China我们在前面其实已经说过一部分了,对吧,你可以把这个channel呢,想象成是我们的一个连接,同时呢,你也可以把这个channel看成类似于Java里面的流。但是呢,它跟我们传统的Java IO的流呢,有如下区别,第一个通道它是可以进行同同时进行读写的,而流只能读或者只能写。对吧,也就是说它,呃,它要么你在读的时候就不能写,但是通道读写它是不阻塞的,第二个呢,通道可以实现异步读写数据。通道还可以干什么呢?通道可以实现从缓冲区读数据,也可以写数据到缓冲,比如说我们把数据可以通过通道写入buffer。我们也可以从buffer读取数据到channel,因此呢,它是一个双向的,那个双向的一,一个一都可以操作。
01:09
紧接着我们再来看下面的关于通道的几个说明,在bio里边呢,String是单向的,比如说我们写的by input stream。他对这个对象呢,只能进行读取数据的操作,因为它是输入流,而NIO做的通道呢,刚才已经讲过是双向对吧,读写均可,因此呢,它的效率比较高。我们再来看,如果从代码的角度来看呢?Channel它是ni中nio中的一个接口,我们打开源码lawyer。我们看一下哈,来,我们看看在。NIO里边这个channel到底是一个什么东西?我们输进去看一下,首先我们看到它是在java.io channels这个包下面,我们输进去,进去过后呢,大家可以看到它实际上是一个接口。
02:02
而且实现这个接口呢,他又去继承了这个接口。我们继续看一下是不是这个接口上面还有接口,这个我们就不往上追了,我们重点是来看一下channel,它下面的实现子类有哪些,因为我们后面呢,Channel用的非常多,我们来看一下走。我们可以看到。在这个channel下面呢,还有很多的子接口。也有它的时限内。时间内,那这里面哪几个是比较重要的呢?哪几个适合我们后面用的比较多的呢?我们往下看一下。在我们做这个呃,Nike或者说NIO开发的时候呢,常用的有这么几个,一个是file channel,听这个名字大家知道是干什么的吧。肯定是对,是通过这个channel对文件进行操作,或者说读取文件的数据。还有一个agram channel,还有一个这个server socket channel和socket channel,这两个channel呢,用的也是非常多的,就server socket channel,还有一个socket channel,它有点类似于什么呢?你可以这样理解哈,我这样一说大家就就明白了。
03:17
这个channel类似哈,我们说类似。类似我们Java里面的server socket。对,而我们的socket channel呢?它类似。那是我们前面学的socket,那有些同学说了,那这两这两这两个一个是server socket channel和socket channel,如果从我们的原理图来看,它到底在什么地方呢?我给大家画一下,可以这样认为,可以认这样认为,在我们NIO编程里面呢,这个服务器这边。服务器那边它会有一个R,我给他写到这server。
04:03
Shed。Sha channel。对,然后呢,当我们大家可以看到,当我们一个连接。当我们客户端有个连接来的时候呢,其实他是先找我们这一个主线程的。对,这个主线程呢,它通过了这一个server socket channel,它会给每一个客户端创建一个对应的socket channel,也就是说实际上大家可以理解成,呃,就说你这个客户端来连接我这个server的时候呢,我通过server socket channel可以给你生成一个对应的一个什么呢?Socket,也就是说大家可以这样认为,在我们这个通道这个地方,这个China呢,实际上就是。这个东西。哎,这样就对应上了,也就是说实际上你可以这么去理解。
05:01
实际上你可以这么去理解,就是说当我们一个客户端连接server的时候,由这个server socket channel呢,给它产生一个与这一个客户端对应的socket channel,然后呢,再通过这个so channel与我们的这个呃服务器进行一个通讯。就这样子,那么我们来追一追,就是server socket channel,还有soccer channel,还有fire channel,它到底在我们这里面的哪一个部分呢?我们来看一下。首先大家看到下面有很多的这个子接口。那我们的server so channel其实是在network work,就是网络串的下面的一个时间之内,在哪里呢?在这大家看没有看到这个server channel,还有一个soer channel,我们先看这个,这下面呢,这个是一个抽象类,所以说实际在我们开发中,我们创建的server soer channel并不是它,它实际的类型是哪一个呢?是它下面的一个实现类,叫server software channel implement就它,也就是说后边同学们注意听。
06:06
就是后面我们真正的这一个服务器端进行这个呃,产生socket channel的类型,其实是这个类型。哦,也就这个类,换言之,你可以认为哈,你可以认为刚才老师画的这个图,它真正的类型。它真正的类型就这个地方,它真正的类型是什么呢?是这个。能力也好,诶往上面再拉一点这类型这个,那下面这个呢,就是同学们看到这个东西就是a socket channel它呢对应的真实的类型实现的。这个对象是哪一个呢?是这个。它也是一个抽象类,看到没有。Server socket channel,它在这里面也是继承了我们这个channel,呃,实现了我们的channel,你可以往上面去找啊,比如说那channel你往上面去找,实际上呢,可以找到它实现的channel。
07:06
这个接口,而它真实的实现子类呢,还是so China implement,也就是说,呃,也就是说这个类型。他其实是这个。好吧,因为我上面再来一点吧。来一点。好的,我就画到这里哈,因为这个空间呢比较有限,我就画到这,大家应该这个地方就看到比较明显了啊,也就是说我们在服务器端呢,会先创建一个server softwareer channel,其实它是真实的类型是这个类型,然后当我们有一个连接来连接server的时候呢,由我们这个server so channel产生一个或者生成一个与该客户端对应的一个通道,这个通道的类型就是so China,而它真实的实现类型的是soer China implement。然后呢,我们再通过这个通道与服务器进行一个通讯,就这样子的,好的,这个我相信大家应该大致明白了,那fire fire channel呢,它主要用于文件的读写,还有一个data gram channel用于是udp数据的读写,也就是它仍然是对数据的一个操作,只是呢,它是对udp的这么一个数据的读写。
08:23
Server channel和soer channel适用于TCP的数据读写,所以他们呢,其实都是有自己各个的应用场景,后边呢,我会举例子来一个个说明。紧接着我们再来看,既然说呃说fire channel呢,它是一个比较重要的,呃,一个实现子类,那么我们呢,待会呢,就用它来给大家演示一下这个在哪里啊,刚才我还忘了,忘了找他了。Fire呢?在哪里呢?显然它是用来读写的,因此呢,它是在这个子类下面。这个下面呢,会有一个fire channel,大家看到没有,这个fire channel呢,大家看到它也是一个抽象类,所以说实际上它真实的类型呢,仍然是fair China implement,我们点进去看。
09:11
就这大家注意观察到。在这个圈子里面包含了很多的属性。这些属性分别是什么含义,后面我们会在讲代码的时候呢,还会再给他追一下,OK,好的,也就是说我们真实的fire圈的类型呢,其实是fire China implement,那现在呢,呃,大体明白了这个东西过后,我们来看fire China里面有一些非常常用的方法,后面我们用的比较多,我给它都一个是read。这read呢,大家看它是对我们一个bit buffer进行这个呃,写写操作对不对?他说从通道读写数据并放入到缓冲区。啊,就是说从通道读取数据放入到我们的缓冲区,明白这意思吧,还有这个right是把缓冲区的数据写入到通道,注意这个方向的问题哈。
10:06
注意这个方向的问题就是如果我在这是个channel。好,这是一个buffer,我写个BB,如果我们是read,它指的是什么意思呢?就是把通道的数据,通道数据往这里面放,我们这个叫做read啊,就是对这个,对这个China来说,其实是你的buffer在read,它明白。那反过来说,Right是怎么理解呢?这个就叫read,对我们buffer,对这个China来说,是把我的数据读入到你的buffer里面去,如果是这个方向怎么理解呢?这个方向就叫right,相当说把缓冲区的数据写入到通道,请同学们注意这一点就是站在站在谁的角度来看呢?站在圈了的通道的角度来看。然后这里面还有几个比较重要的方法,一个transfer from,这个方法呢,后面是可以用来做什么工作呢?可以用来做像文件的拷贝速度很快,大家可以看到这里面有些参数哈,我就直接说他的方法是从目标通道。
11:08
从目标通道,也就是说从目标通道复制数据到当前通道。什么是目标通道呢?就这个。啊,也就是说这是圆,我我把你看这个是read able by channel,那你你有同学们有没有注意到,刚才我们在看idea的时候,其实也看到一个readable readable by channel,也说我把这个通道里面数据,呃,读入到当前的一个通道啊,OK,那现在还有一个transfer。Two。Transfer to,那transfer to是干什么呢?大家可以看到right。By channel,它是把数据从当前通道复制给目标通道。什么意思,就是你当前通道不是有数据吗?诶当前通道有数据。当前通道有数据,那么我可以把当前数据的这个,呃,我可以把当前通道的数据呢,复制给目标通道,目标通道就是它。
12:08
看到没有,相当于说我把我的数据给你,给你写入到你这个通道里面去,这个意思,那后面呢,这个transfer to啊也是非常有用的,因为它底层呢速度很快,他用实现的零零拷贝,好,那现在呢,我们对它有一个基本的认识了,对不对,有了基本认识呢,下面呢,我们会分别写四个案例。来对我们的通道的一些方法进行一个详细的说明,好,那案例呢,我们就在下一个视频为大家进行一个讲解。
我来说两句