00:00
同学们,我们现在呢,把这些客户端这块就写完了,对吧,写完了过后呢,我们现在需要把服务器端,还有客户端的启动代码也写一下,那现在我们开始写,那显然我把这个工作呢,放在他的主方法这完成。没问题吧,好,现在我们开始做这个工作了,做什么工作呢?第一步我们先从客户端开始玩,先启动启动我们的客户端。客户端好代码呢,咱们就这样写一句,又一个group。赚。好的,拿到它。Group,我们取个名字就叫chat client。当然这里面也会有异常发生,那么这我就直接扔出去就可以了。下面继续往下走,下面呢,我们拿到过过我们起一个线程。哦,我们起个线程,起个线程的话,咱们怎么做这个这个事情呢?咱们怎么去启动一个线程来做这个工作呢?非常的简单哈,就这么写就行了。
01:06
启动一个线程。六一个12。对吧。六个SH 6SH的功能里面怎么写代码,这里面我们要去。把这个方法给他写一下,叫public。Public。什么呀,Void run。把这个方法呢,我们进行一个重写。那么这个run方法这边是不是有一个方法,就是启动过我们直接就干脆start下。十大就可以了,好简单一点,那其中这个run在这个run。方法里面我们写什么东西呢?肯定是一个Y循环。对,是个Y循环,没问题吧,同学们。那外循环我写什么内容呢?首先我就是在这里不停的去读取。
02:00
对不对,就说我读read for。Read info就说我每隔一定时间我都去读取,我每隔一定时间就去读取,然后呢,这边呢。我们再起一个线程读的时候呢,也不需要就是时时刻刻读,我们每隔一定时间去读一把就可以了,Catch。有一个异常拔出的话,应该是特。啊,Interrupted exception对不对?好,写到这里就可以一点输出这个信息。那这边由我们这边进行一个什么呀,这样一个信息,thread.current。Thread点什么呀?Sleep。休眠吗?诶点。SL。是EEP。好在这里面呢,我们休眠三秒。代码就行了,这个地方相对说我这起了个线程干什么呢,不停的去读取数据,就是每隔。
03:03
就每隔什么呀,每隔三秒三秒。三秒读取,读取从服务器端,服务器端可能发送的数据啊,读取从服务器端发送的数据。对,那这个还没写完呢,你现在只是在读,那你发送数据是不是你还没做呀,是不是现在呢,我们还有个发送数据,我们现在还要说发送数据,就是客户端发送数据给服务器端。那这段代码又应该怎么写呢?非常简单,六个scan。就是因为我们发送的数据是从这个控制台输入的。所以说我就。创建一个扫描器来进行一个处理。VR。好,拿到scanal,拿到scanner过后呢,我在这面有个Y循环对不对,我怎么写呢?scanner.has next,我们一读取一行就行了。
04:03
Next。Hands。Next。Next。那。好,只要他还有下一行,我们就去读取,读取的时候怎么读呢?scan.next。对,然后我们得到的就是一个字符串了,对吧,就是一个S,这个S呢,我们就通过client chat client就是我们创建的。客户端。对象实例调用我们刚才写的send in for扔出去就可以了。也就是说我们读取的时候呢,是在循环的,就是我们在读的时候是循环的读取每个三秒,然后呢,我这个地方也有个Y循环,可以不停的等待你客户端的一个输入,在服务器端呢。啊,客户端这块咱们就搞定了,回到回到我们的服务器端,服务器端是不是我们也需要做一个启动的工作,是不是同学们服务器端这块呢,相对比较简单一点,我们就这样说创建一个什么呢?OK,我们创建跟着老师创建一个服务器。
05:15
对象。OK,那这样很简单,就六一个group。ER Cha shower。点VR拿到。下一步我们就干什么呢?直接让他进行一个监听就可以了。监听就是这点listen。因为在这个监听的过程中,他已经把相关的整个业务都处理好了。好,同学们,现在呢,我们到了来验证我们的代码是不是OK的时候了,代码到底能不能跑起来,呃,能不能,呃,没有什么错误哈,我们来验证一下,先启动我们的服务器端,这是肯定的。先启动我们的服务器端。看代码。
06:03
好,现在服务器端呢,它已经处于等待,大家看是不是每隔一两秒钟它输出了一次,那这样这样子为了好看呢。我们这儿。我们这这个地方先展示,让他阻塞在这里好吧,因为为什么现在他每隔两秒输了一个等待呢?是因为我这里在监听的时候,在select的时候啊,他只是等两秒,现在为了我那个好输出,我先把这两秒先去掉好吧,就相当于说如果没有事件的话,先塞在这个地方。好,我们再来启动一下。好的,现在呢,就没有在输出,现在我们启动客户端。启动我们的客户端。出了问题了,大家看,诶,那么我们看这个错误是在哪里呢?他说D在第29行,第29行它发生了一个空指针异常,对不对,你在这个,呃,在我们的服客户端这边哈,客户端这边,客户端这边的话呢,第29行是这。
07:09
是这那如果是这里的话呢,那显然我们这个open。就这个open这地方应该是没有去接收这个数据,好我接收一下。怎么回事,这个。动不了了,这儿。怎么怎么动不了了呢,这。这边呢。喜欢就不新了。不能改啊,这太欺负人了,太欺负人了,这个。关了吧。关了,我重新启一下。哦,再欺负人这个。好,我们找到刚才的那句话,就是在29行。第29行这边open呢,这个open完了过后,我们并没有去接收,说这个客户端呢,肯定是要出问题的,我们搜一下就行了。
08:05
等于OK,好,这样子呢,肯定他就不会再去报刚才这样一个控制层的异常了,好,我们继续来进行一个测试。但这个测试呢,可能还会有错误,我们发现错误,我们调调整就行了啊,不是什么大事,运行。好,这时呢,我们已经把open打开的,嗯,返回的值进行一个接收。好,现在呢,我们仍然启动我们的。这个客端。好,同学们可以看到现在呢,呃,我们可以看到这个时候的的确确它已经发生一个OK了,但他说远程主机强迫关闭的一个现有连接,那应该是我们的服务器还有错误,服务器哪里有错误呢?打开这边它又抛出一个异常,他说是一个非法的blocking mode exception,那一看这个错误大家就应该知道,我们在服务器端肯定有一个动作,忘了去设置它的非阻塞,找到找到那一行应该就在60行左右。
09:04
可,可能在这个地方大家看,当我们去产生一个生成一个socket channel的时候,是不是我们忘了设置非主色,很简单一句话。c.confi。把哪个加进去呢?代码就结束好。这时就没有问题了。我们再次运行。就是你在写代码的时候,可能会因为某一句话忘掉了,这是很正常的,因为你写代码,你你在现咱们现场敲代码对不对,那有可能有一句话老师没有没有想到,这是有可能的。好,再来写一下,把这个关闭再来开。大家看看,这时我们再看有没有其他问题啊,他说OK了。好,这边上线好,我们上新上线多来几个吧,是吧。没有问题。第二个。啊,51287也上线。没问题,再来。
10:01
再来。第三个客户。也上线5195上线,5195上线,那现在这边呢,是不是也有三个上线都给你拿到了,我们现在进行数据的发送发送,比如这边呢,我写个hello音。就是我我在写,我说我是谁谁谁好吧。我是。五幺。272。七二回撤,那这样一回车过后呢,这两边得到消息了吗?得到了这边也收到了,好我们这边呢,回送一个消息啊,他说我是。五幺。287回车,回车这边是不是也拿到了呢?是不是也拿到了。这边也拿到了,好同学们看到他现在呢,检测到客户端这边呢,检测到没有可用的通道,这是正常的,这边应该也有啊,他一会也会检测到,那现在呢,我们再来再来发送,他这边发送一个消息再说,比如说。
11:00
呃,我是我写哥啊,我是哈回车,那这边一发送过后呢,这边收到了吗?这边就没收到,因为因为你在这地方不停的这个打印,嗯,这个地方就会有影响,所以说我们在这个提示信息呢,做一个修改。到哪修改呢?我们找到group c group Cha CLA,找到这地方。这个地方其实就是说,当我们没有可用通道的时候,其实没有必要输出这句话,我们就来一个continue就就能解决问题。就来一个continue就能解决问题。对。Continue,或者叫我们看这篇是怎么写啊?他在这方是一个if语句。L4,那这个地方我们就暂时不不提示任何信息就完了,就说相当于说如果你没有我们就不提示信息就可以好,我再把这个处理一下啊。关闭。
12:00
把这边呢也关闭一下。因为这句话其实其实也是没有什么实际意义的,来重新来。点起来。好,服务器端现在启动了,服务器端现在启动启动我们的客户端。启动我们的客户端。这边再启动我们的客户端。第二个。再启动第三个功能。没有问题吧,好这样这样子呢,三个都有了,这边也上线,我们再来发送,我是。51317。好回车。那这两个呢,应该是收到了对吧,我这我是。五幺。333回车。好,这边呢,也收到了。好这边,呃,我们中间这个没有发,我来一个我是。51325。
13:01
诶,51325写错了五幺。325回车,好,这时呢,它发送过后,同学们可以看到。这边发送的是我是51325,他没收到好像是吧。这边也没有收到,那这是为什么呢?我们来看一下原因。消息转发已经OK了,但是这边呢没有收到,那说明我们客户端这边还有问题。过在这边还有问题,那么我们来做息进行一个调整,看看问题在什么地方哈,就是说有时候你需要进一个测试才能知道问题在什么地方。看这里。确实是服务器端没有拿到,没拿到的话呢,我们来看看问题在什么地方。呃,看一下这个问题啊,这个问题呢。我我们看了一下,我们看了一下这个问题啊,应该是在哪里出了出了的呢?这大家有没有发现在我们客户端这边,我们进行一个操作以后,是不是有一个非常重要的动作,我们忘写了什么地方啊,就是我们需要把当前这个K。
14:16
移除掉。是不是,诶你看我们这是不是忘了做这个操作了,如果没有这个操作,那么这个代码肯定是要出问题的,好,我把这个代码呢,呃,把这句话加进去。嗯。他这儿又卡了我这个。我这个idea好像有点问题。好,重新再换一下,再打开。好,同学们,那现在呢,我们把刚才说的这句话加进去,问题就应该得到解决。怎么写呢,就是。点什么呀?
15:01
呃,这句话很重要,干什么呢?就是删除当前的selection。Selection k啊为什么呢,防止防止一个重复操作。重复操作。好,那现在呢,我们再来启动一把就OK了。运行。把服务器端启动起来。Ready哈。把服务器端启动起来,再把客户端稍等片刻。服器端。在这个地方还没有启动成功哈。再重新来一下。启动一下。服务器端启动OK了,来启动我们的客户端。启动我们的客户端,好,连接成功好,我们再启动一个。客户端两个了。
16:00
对吧,我们再启动一个。三个,那么这三个呢,都拿到客户这边分别提示三个上线,好现在我们来,呃,提示一下输的信息,我是五幺。46回车。那这边两个呢,应该收到了,没有任何问题。这边再写,我是。五幺。455。我是51455,好的,那这边发了功能,这里面两边收到了51455,这边也收到5145,我们看第三个。人家说我是五幺。463。他发出去了,那这两边呢,也收到了,看到没有51463。51463也没有出现其他的情况了,大家看这里这边呢,消息转发上线也都是正常的,对现在呢,我们把这个关闭一下。这边一关闭呢,OK,这边就提示某某离线。
17:04
同样这边一关闭,这边也提示。某某离线这边。一样的。对,这边也提示某某离线了,好同学们,那关于这个小案例就是关于。网络IO网络实例。群聊系统我们就给大家讲解,讲解到这里,OK,其实也不是很难。就是按照刚才老师讲的这个步骤,服务器这边呢有这么两个步骤,客户端这边呢,我们是有三步,但是我们实际上是一次性。啊,就把它全部写完了。同学们要理解这段代码呢,最好自己去啊,多写几遍效果就会更好一点,好的,那现在呢,我们把刚才讲的内容哈,进行一个简单的梳理。我们刚才是讲到哪里的呢,OK。我们是从。这块开始给大家讲解的。
18:02
这块是不是已经整理过了,Selection k是不是没有没有梳理啊,我们看看上一次梳理到了非主网,呃,NIO非阻塞网络快速编程,那现在呢,我们继续梳理。应该是这个,那现在呢,我们梳理到select selection k。往下走。K。我们讲了哪些内容呢?看一看。3K呢?我们首先给同学们做了一些基本的介绍,对它代表一个什么含义?对吧,第一个。它可以看作是表示select和网络通道的注册关系。那么一共呢?有下面几种,我就不再一个个的念了。第二个。第二个我们说了selection k,它相关的一些方法有哪些?
19:03
哎,常用的一些方法有哪些,那这块呢,我们就直接截一个图。就可以了,这是我们说的3K。那紧接着呢,我们继续往下走,下面呢,我们是不是给同学们说一下server。Shocked shocked China相关的API。梳理到这里。对。梳理到这个位置好的,那这块呢,我们就直接把它拿过来好吧,就是第一个呢,我们说呃,这个server socket turner,它表它的主要主要的是主要的功能是干什么事情。往这儿放一下。还有呢,它相关的一些方法。对他相关的方法呢,就是这些,我在这呢也做了一些注释。给同学们板书过了。紧接着我们继续往下走。下边呢,是不是就给同学们讲的socket China?
20:04
而且也梳理梳理了他们之间的关系,就是server socket server socket channel和socket channel之间的一个关系。那么socket的China呢,它主要是负责我们数据的一个读写,所以他们分工呢,还是有不一样的地方。来放这相关的方法,我也给大家梳理过来。实际上就是这块。截个图哈。放到我们的笔记中。紧接着呢,为了加深对他的认识,我们用IO网络啊网络编程写了一个什么呀,群聊系统。渠道系统呢,你要说呃,复杂呢,确实也不复杂,但是呢,就是同学们要把它搞清楚,还是要稍微花点时间的好吧。这是实力的要求。我们实际要做的事情。我梳理到这儿。
21:02
那最后的代码呢,还有示意图,我也翻过来。示意图。示意图就是分析的和代码。分析的时候,我们实际上是借助了原先的这两张图啊,一个就是。就是这块它的一个。几个组件相关相互关系的一个图,以及这边的一个界面。好,把它翻过来就可以了。然后代码呢,那不说我们直接放这就行了,代码。代码主要是分成了两个部分,对不对,同学们两个部分哪两个部分呢?一个是我们的客户端。一个是服务器端,我们先写的是服务器端,还有印象吧。把它放入到我们笔记中,但最后这个源码呢,也会给大家分享的。然后这边是。我们的客户端就是。客户端代码。客户端代码,同样我们把它放过来。
22:02
是吧?非常简单哈,非常简单,放过来就可以了。上面这个是服务器端。我上面加上一句话。这块是我们的服务器端,往往上面推一些。对在这诶再往上面来一点,这是我们的服务器端。服务器端。好的同学们,那关于这一讲,我们就先跟大家说到这里。
我来说两句