00:00
下面我们把客户端这一块也把它写了,下面呢,我们把服务器端写完了,对不对,客户端呢,相对来说比服务器端要简单很多,我们来写一下。来,走一个。嗯,在这边呢,新建一个教类。叫NIO。好,同样我们写一个主方法,那现在应该怎么做呢?还是第一步得到一个网络通道。大家还记不记得,就是我我们在画这个图的时候,是不是你这个client实际上要跟服务器通道,呃,服务器通通讯的话呢,会产生一个socket China和它是对应的,那下面呢,我们来得到一个通道,怎么得到呢?非常简单,就soed。channel.open。
01:00
VR。好,Shorter,那现在呢,他也会有异常抛出,这里面我们先简单处理一下,就先扔出去。好,接着往下看。通道对象创建起来了,但是实际上呢,他现在还没有办法去,呃,真正的跟服务器通讯对不对,所以说我们现在第二步设置非阻塞。非阻塞模式。那这块呢,用socket的点还是跟刚才一样,Config blocking做成一个force。下一步继续来来做,下一步是不是我们要提供干什么呢。提供服务器端。的IP和端口,为什么?因为你客户端是去连接服务器端的嘛,所以你要知道服务器的IP还有端口,那这个这块呢,我们就来六一个。这样的。
02:00
A socket address。那首先第一个参数呢,我们指定是127.0.0.1,本地端口我们前面写的是666。好的。生成这么一个socket address对象。拿到以后我们就可以连接服务器了,同学们,我们知道客户端这边在连接的时候呢,它也可以非主色的形式来连接,因此呢,我们可以这样写,这段代码怎么写呢?大家看我们这样写啊。If。我们怎么走呢?Channel就是我们刚才的。这个socket channel。点connect。对connect,把这个connect往这一写,把地址放进去啊。把地址放进去,同学们,这个方法呢,他也不会阻塞在这里,那怎么办呢?如果成功我们可以往下走。
03:02
如果成功可以了,但是如果他不成功呢,他也不会主塞这里,所以说我们在可以这样来处理一下,如果没有成功,我们干什么呢?我们可以说出一句话这样写,我要循环,大家看我这个这个是什么意思啊。China。如果没有完成finish。因为它连接的时候呢,它是需要一个时间的。如果没有没有完成这个连接,我这打一句话表示什么呢?我写一句话,看我的提示客户端就是。因为因为连接。我们去写,因为连接需要时间,需要时间客户端,客户端不会阻塞。不会阻塞,我可以做些其他工作,可以做其他工作。工作。我这句话的意思就是告诉大家,如果我们客户端在连接服务器端的时候,它没有连上,它也可以不用阻塞在这里,可以去做些其他工作,明白吧?那当然了,如果这个if已去整个这个地方返回是一个帧,就说明什么呢?就连接成功了,如果连接成功,我就可以发数据。
04:13
这样写,如果连接成功就发送。就发送数据。同学们,话说数据其实挺简单的,我们写个字符串。我们就简单发一个字算就行了。找一个我们叫做哈上硅谷。一个波浪号。我们准备把这个字符串发给服务器端,那同学们也知道哈,我们知道,就说你在这边发的时候呢。我们知道就是你服务器端这块有八份。我们客户端这边是不是。也需要一个buffer啊,一样的道理啊,一样的道理,那现在呢,我们同样产生一个buffer,用一个buffer创建一个buffer。
05:02
Buffer点,呃,我们直接用这个方法,第一现在第一次用这个啊,我们写一下它是什么意思,是g.gets。我说一下这个方法是干什么的?写一个buffer,我们看一下这段代码,这个rap的含义是什么进去。这个方法呢,是包裹或者是或者说是。呃,生产生一个字节数,数组到我们这个buffer里面去,字节数组到这个uffer里面去,什么意思呢?大家还记不记得。我们原先产生一个buffer的时候呢,都要去指定这个buffer的大小。是吧,比较笨拙,所以说NI呢,它提供了一个方法叫rap,它直接可以,呃,根据你这个地方字节数组的大小把它放进去,而这个buffer的大小呢,也跟你这个字节数组大小保持一致。
06:00
诶,这样就比较简单一点了,所以他说叫rap的包裹了,就叫这个单子,Rap就是包裹的一个字节数组,到我们buffer里面去啊,就是这样子就不用说,哎,你要去指定一个大小。因为因为多了不是浪费吗?少了呢又不够用,所以说他提供这个rap比较方便,然后下一步我们应该做什么事情呢?发送数据。所以发送数据,其实说白了就是将这个buffer里面的数据写入到我们的China里面去,是这意思吧,现在反过来方向了,就是说对于China来说,是你把buffer侵入到里面去。因此呢,是这样子的,将。实际上就是将八份。数据写入。写入哪里呢?写入我们的channel。没问题吧,那这句话也很简单,就直接channel。Socket channel。点right。Write什么呢?Right,我们的buffer。
07:01
OK。好,这个是代码,咱们就。写完了,那写完过后呢,为了让这个代码停在这,我们再输,我们再输出一句话,让他把代码把这个客户端停在这地方,用shift in给read。好,我读一个读一个就是代码会停在这,好代码会停在这,好了同学们,那现在呢,客户端我们也写完了,其实也非常简单,捋一下这个思路,就是干什么呢?我客户端这边呢,先生成一个呃,Server。So,呃,Server channel,然后呢,我就给你连接哦,如果连接没有没有成功,我就在那在那里干什么呢?非主塞的循环,你看我这边为什么叫非主塞的循环,就是你看如我在连接,连接不成功,我连接没有没有成功的话呢,我就在这里呢,给大家一个提醒是吧,它最终它肯定是要呃连接成功的嘛,好,然后连接一旦成功了过后呢,我就把一个字符算做成呃,转成一个字节,字节数组放到这个buffer里面去,再把buffer的数据写入到这个socket channel soer China,拿到以后呢,你这个narrow。
08:11
Server呢就可以跟,呃,在这监听的时候呢,他也知道是什么事件,然后从这个shock腔里面再把数据再读出来啊,你看这个buffer是不是又把这个buffer里面的写,他会写到这个,写到你这个通道关联的。嗯,Buffer里面去,然后再把这个buffer呢,干什么呀?呃,读到我们这个China里面去啊不不不说错了啊,是把这个China,因为你把数据已经放到China里面,再把China的数据放到我们这个buffer里面去,再显示出来,好的同学们,代码写完了,我们来进行一个小小的验证,看看到底O不OK,来运行一下。跑起来。运行哈。运营起来过后,我们看看这边是不是已经开始在处于一个监听状态哈,好的,那现在我们你看同学们看服务器等待一秒,如果没有连接,是不是在不停的打,他在哪里输出这句话的在这。
09:09
是不是在这里啊?在这里。呃,他有一个S过后呢,嗯,等了没等一秒,他说诶等了一秒没有连接,没有连接我就在这走,所以说这个S呢,其实就主塞了一秒。就这意思,好,现在我们把它清一下,然后呢,我来客户端连接。运行一下钩端,这个时候呢,他就先产生的第一个事件。也就是说这个时候。同学们可以看到,其实这个时候这段代码应该走过了。哪段代码呢?就这个事情应该走过了,但是还没有走到这来,也没发数据,这样子,我们为了能够看到这个效果哈,我们在这。在这打一个话。就是呃,客户端连接。这样说啊,连接成功。成功生成了。
10:02
这样写。生成。生成了一个。Socket channel,这个socket channel呢,嗯,因为每每个客户呢都有一个,所以说我把他的哈希code也打出来看一下。好的。哈希扣的好,这样子我们就可以看到一个效果了,来,我们再来重新运行一下。跑起来。好,现在呢,它是属于一个等待状态,对吧,每个疫秒他说没没有连接,没有连接,现在我们来走一下,走起来。好,第一个动作。好,你看这个地方呢,我们出现了一个呃异常,这个异常是怎么产生的,我们来看一下问题在什么地方,我们进行一个简单的调试。看一下问题在哪里呢?嗯,大家看这里面我们应该有一点提示,就是说他是一个非法的blocking mode exception就是一个非法的主摄。
11:09
模式的异常,那么是在五十五行,也就是说这句话出了问题了。那这句话出了问题,大家想,大家觉得是什么地方出了问题呢?大家想你这个地方。你这帮产生一个呃,So China过后,你没有把它指定为一个非主色的模型,所以说它就报错了,那怎么办呢?非常的简单哈,我们在这里呢,还是要加一句话的。我们在这儿加一句话。在这里我们加一句话,诶,这个上哪去了?光标上哪去了?在这儿。好,诶,这先停一下。
12:02
好,现在应该正常了。我们还回到。我们还回到刚才这个IO ii IO server。然后在这里面呢,我们加上一句话就可以了,在哪加呢,就在这,当我们得到一个so China过后呢,我们要我们要把它设成一个非主色的来加句话。好将。将什么呢?将这个short channel。设置为,设置为非阻塞。非主色。好,那这个嗯,这句话怎么写呢,代码怎么写呢,这样写就行了点。Config rocking加一个force。好,现在呢,我们再来试就没有任何问题了,我们看一下。
13:02
运行。这集突然慢起来了。跑一下。好运行起来。好,运行起来过后,大家看服务器在这里,等待我们再运行一下客端。好的,看客户端的效果哈。同学们可以看到服务器这头呢,就拿到了一个信息,而且当前这个烧China是哈希code是这个值对吧,他拿到了从客户端发了一个hello,设硅谷,那么我们再来运行一个。再来运行一次呢,大家可以看到我们server这边n IO server这边呢,又得到了一个话,得到了一个hello,上硅谷,但是呢,同学们看两个so channel是不一样的,前面这个是幺三。386多少多少,这边是10282多少多少,现在这是不一样的,对吧,所以说他不会,呃金他就说相当于说我们前面说的这个规则是一样的,就说我们每来一个客户端就会产生一个channel。
14:11
跟他进行对应,好的同学们,那关于NIO非主色网络编程的客户端和服务器端,我们就写到这,大家体会一下,最好呢,同学们把老师的代码自己写一遍。
我来说两句