00:00
我们趁热打铁。现在编写。客户端,客户端其实这里面其实按理说应该也有两个流程,一个是什么呢?连接啊,也有这么几个流程,连接服务器。第二步呢,就应该是干什么呢?发送消息,就是它可以,呃读取我们这些书的东西,把它发过去,第三一步是不是他还可以接收消息啊,接收服务器端的消息。所以他其实呢,也有这么几个流程,那现在呢,我们就把它快速的写一遍就可以了来。因为有些逻辑很相似哈。我们写一段什么呀,Group chat。然后。同样,我们先写。呃,主方,诶主方法先先放这吧,先放这啊,待会再说,我们先定义一些属性,定义相关的属性也很简单,就是跟着我的思路走就可以了,Private我们先定一个final,然后呢,什么呢。
01:01
定义这样一个东西,就是我们要连接的主机在哪里,叫host。我们要连接的IP地址是127.0.0.1,这是什么呀,同学们。这个呢,就是我们的服务器,对跟上老师输入服务器的IP。是不是除了服务器的IP要知道之外呢?他是不是还需要知道服务器的端口?也写上int。In类型,那in类类型呢,我们仍然是port。什么呀,端口我们就写6667,跟它保持一致,这是端口服务器的端口。好服务器端口拿到以后,下面呢,我们是不是也有select。哎,咱们也得也得创建select,那就写了啊private。Select。OK。我们引下。
02:02
引进去sector还有什么需要呢?我们是不是在连接的时候,它有个通道,就是这边客户端也有一个shocked channel,因此呢,我们也要到时间进行一个初始化。Shocked。Shock China这个地方我们去取个名字,China。好的,下一个还有什么呀,是不是在发送的时候,客户端它自己会提示他的IP地址,那么这个时候我们就取个名字,比如说叫做user name吧。啊叫username,这是相关属性就行了,然后我们写构造器。构造器,因为前面大家已经有一定基础了,所以说我这呢相对写的快一点。好的,那这边我们把它包起来啊,Public。Public。构造器,那这边我们仍然是完成一些什么呀,初始化的工作,也是完成初始化工作。完成初始化工作。
03:02
没问题吧,完成初始化工作,首先呢,还是老规矩,我这里就不写注释了。同学们直接。写代码好open。这个地方呢,我们是要先拿到写错了select。select.open。对,这边呢,我们就初始化select。显然他也会有什么呀,他这边也会有异常,所以说我这就直接扔出去就可以了L。I城。接着往下继续写,拿到选择器以后,下一步是不是连接。连接我们的服务器,连接服务器是不是用我们前面写过的,呃,相关的方法就可以了,怎么写呢,一句一句话到位啊,就so China。点。Open。Open。Open什么呢?Open。看看这是哪写错呢?So china.open。
04:05
OPEN。Open open完了里面呢,咱们直接溜一个。他的so的地址。这边我们填什么呢?填上IP。127.0.0。一然后这边还有一个端口对不对,就是。可以了。好,继续往下走,设置非主色。设置。我们叫设置非阻塞。非主之后,这句话应该怎么写呢?前点config。写上一个Bo没问题吧,下面我们就要开什么注册,将什么呢,将channel注册到。注册到center。思路其实是大同小异的,好,那现在呢,我们怎么注册呢?So china.register。
05:02
Register,好的,同样我们这边写上select,然后我们关注的世界,我们关注的世界是。什么呀,Read?我们是op p。然后下一步该干什么呢?下一步我们得到得到这个user name,得到这个user name其实挺简单的,就这写就行了。user name在于通过socket channel。Socket写。So,诶,我们这有个socked这样写吧。类型不匹不匹配,China。点get local address就可以了啊,Local本地的一个地址,那如果你要写写的这个直接是一个字符串的话,你把它转成一个字符串,然后再sub。STRING1好,这样呢,可以也可以拿到他的地址,这个我就不说了,然后这边我们分配给user name。
06:04
这样就拿到哈,这就是我们相当于说是我们客户端的他的一个local address拿到了,拿到以后这边我们提示一句话就说客户端准备好了。什么意思啊,就是我们的客户端,就就是user,当前这个username这个客端。Is OK。Is OK,准备好了。好,这是我们初始化的工作,初始化工作完了过后,下一步是不是就可以向服务器发送消息了,因为它。到这个地方已经成功了吗?这个open打开。这样就已经成功了。下一步该干什么呢?我们像服务器。就是像。服务器发送,诶发送消息,那这里面我们专门写一个方法就可以了,Public void void send for。对,那你要发送什么消息,你把消息给我。
07:02
是不是消息给我,那你发送消息的时候,我们首先要这样子来写这段代码哈。比如说你拿这个消息过后,我们把它组合一下,In for等于什么呢?等于usually。加加一个什么呢,说啊,这样看起来比较好看一点,说什么呢,再把这个info拼接一下。理解我的意思吧,就是说这边是这么一个含义,就说诶,如果说你给我来了一个hello,我就把当前这个客户端的它的地址拼接上一个,说再把消息拼接上整个做一个整体再发送给我们服务器,那在发送的时候呢,可能会有异常抛出,所以说我这就将来开始写了啊,就TRY。Catch。啊,这边也会有IO异常。那这部这边代码应该怎么写呢?应该怎么写呢,这样写。
08:01
这样写就行了,直接用我们的so.right。这里面我们直接把这个buffer就创建起来。八分终结就bite。八分。什么呀,点rap诶不要这样了,直接就RAP1。怎样呢,就是in for.get BAS这样一步到位啊就完事了,也就说这句话呢,就把我们消息。发送过去了。把这个消息发送过去了,好发送消息完了,是不是我们还有一个就是读取,读取从服务器端回送的,或者回复的,回复的。回复的消息是这样子吧,同学们,那现在呢,我们再写个方法,Public。什么贸易的read?Read,前面这个是send,现在是read。我们要读取一下从服务器端发送过来的消息是哪些好,这个读取呢,我们就这样子也是串。
09:06
因为也有可能异常发生。好的。先写到这儿。嗯,好的,那在读取的时候,咱们这个具体的操作应该什么样呢?跟原先非常的相似,还是用我们这个select选择器进行select操作,然后它会返回一个值。对,就是他选择我们这个通道,有没有事情发生,那这个时候呢,我们叫做read China,我们就取个名叫read channel,有几个哈,Read channels。好了。那现在我做一个判断,还是老规矩,Reads,它如果大于零。说明什么呀,说明有可用的通道,就是说我这边可以读了,即。有这个通道,通道有。有可用可以用的通道。
10:03
或者说。或者说什么呢,有事件发生的通道了。那现在这个大于零,那下一步我们应该怎么做呢?显然跟原先的思路可以说是。大同小异对吧,大同小异,那这个时候我们就这样写就行了,Select。点sell case。对不对,我们也把它所有注册到这个S上面的,呃,K全部拿到。点为二。好,拿到这个,拿到这个过后,我们是不是也可以拿到迭代器,也可以一步到位,你可以这样写。拿到结构,我们立马呢就来一个eity也是可以的。然后我们就对这个底,这个eer进行一个同样的迭代外循环,怎么写呢,就是editer点。Hands next就说有没有下一个。
11:00
如果有下一个的话呢,我们就继续处理,因为我这里面考虑的就是客户端也有可能有多个通道,对不对,这也是有可能的,所以说我们这考虑的会相对多一点,就是你这个如果客户端我们这边有多个通道也是有可能的,所以我们是这样是进行进行一个多通道的一个处理,那下面呢,我们就来开始获取吧。拿到这个地方,我们从K。啊,这样子写点next。VR。我们就拿到一个K。呃,拿到这个10HK呢,我们就叫这个。K吧,就叫K,还要保持一致,就叫K。然后在K给我,我们就判断,如果这个K呢,是一是。Accept re,啊,那呃,就他这个方可能不会去等待别人接收了,我们就关注一件事情,k.is read able,对吧,我们就不像服务器那样去处理了,如果他现在是可读的。
12:02
如果是口读的,我们就得到得到相关的这个通道了。通道,其实呢,如果我们只有一个通道的话,呃。就处理起来更简单一点,现在呢,我们考虑是多通道得到相关通道的话呢,还是老规矩就是k.channel。对,然后我们这边呢,用哪个来接收。我们用哪个来接收呢?我们实际上还是要得到socket。Socket channel,比如说这边我们取名叫SC,等于枪断一下。诶强断一下转成socket channel拿到了,拿到这个so China以后是不是我们也是得到一个buffer。得到一个buffer,因为你现在在输,呃,得到一个buffer,我们怎么去做这个事情呢?非常简单哈,我们就这样子写就行了,败buffer。点OK,然后写个1024好,这次呢,我们用分配的方式来做,反正方法呢。
13:03
大家可以灵活使用。下面呢,我们就来读取。读取,读取的时候我用sc.read。因为我现在是从通道里面。读数据到我的buffer里面去,读到了,读到以后,对读到以后下面做什么事情呢?好把缓冲区的数据,把读到的,读到的缓冲区的数据干什么。转成。转成自传。A转成字符串非常简单,那就六。使劲给他老师失落啊。八分。第二。什么呀,阿瑞。就拿到了,然后得到一个字符串。这个字符算呢,我们认为就是待会要显示的消息,我就MSG。对吧,然后呢,把他这个消息。拿到我们就输出一下就可以了。
14:01
走一个输入的时候,咱们就MSG,为了好看呢,我们可以把它的头尾的空格给它去掉一下。好的,弹幕就写完。当然了,还有一种可能性,就是你在这地方杀了之后,你拿不到。这个不等于零,或者不大于零,不大于零的话呢,我们怎么做呢,我们就来一个S。对不对,叶老师,我们提示另外一句话说没有可用的通道。其实一句话叫做没有可用的通道。没有可。没有。可用。可以用的通道。好的。写完了,但是这个地方同学们看我这边用的是,如果后面我没有带参数,其实它是主塞在这里对不对,你也可以写个两两两两千对吧,也可以就看你个人的一个习惯就行了,如果你确实说,如果我在你拿不到信息,我有别的工作要做,那你就写个2000,然后呢,你这地方就去做别的工作就可以了。
15:03
然后他一循环,他又去进行这个sector就可以了,好嗯,那这面我们就。主塞在这里吧,啊,主塞这里,主塞在这里,好,这是我们的read,那read这段代码在哪里去调用呢?大家看S的方法咱也写好了,Read方法也写好了,显然我们现在在用的时候,我们是需要启动一个线程来不停的进行发送和read函数的调用,是不是?所以说我们现在还需要最后一步什么呢?就是怎么去把它调用起来。好关于调用这一块,我们放在下一个视频为大家进行讲解。
我来说两句