00:00
所以我这个代码我写的都非常谨慎,看到我写代码速度适当的放慢了一点,啊,适当的放慢一点,那现在呢,我们就开始要写。客户端了,那客户端这块呢,你得想这个事情啊,人家已经把东西给你了,那你得想把东西送到哪个位置了。他把这个结果给你送到哪去了呢?你比如说你看啊,你你这个上线了过后,你上线了过后你不是呃,通过你服务器端你搞了一个你在这便利了吗?你你你做了肯定掉掉你你调它了吗。你上来过后,你调了一下这个notify error on online user,然后它里面就去便利的这个所有在线的人,然后呢,把它一个发过去,最后他的关键点是最right的一下。那你得想它歪到哪去了?他把这个包包就是那个notify user,这个会送到什么地方去了呢?得得想。
01:00
对了,这个地方你一定要分析出来到哪去了啊,因为。大家都知道在客户端这边,其实人家早就一直在等待你的,这个他就已经等到黄花菜都凉了,终于发现有人有人发东西回来了,不在这吗。我在这起了一个跟服务圈保持通讯的一个携程,你要一直在等呢,客户端正在等待读取服器端发出消息,终于等到了一个结果。终于等到一个类型,这个类型你现在干什么,你把这个ma拿到过你你你就直接跑路了,你说你写了一句话,同学的消息下步处理,诶这不是以前我们留的一个逻辑孔在这吗。哎,你看这个地方都是有都是有有有思考的啊,不是说乱七八糟再去写的好,那现在你要真的要去处理了,那处理最好的方式肯定就是用先看你的这个返回的消息的类型,又是那个那个套路了,Switch就是你你复近端返回什么消息类型,我就处理什么类型,好,那代码呢,就应该这么去写了,Switch。
02:03
SW,它的类型,我们首先把message的那个类型取出来。好,那么这个时候呢,我就要做一个判断case。如果这个消息类型它是message点。我们这一帮都是用的这个包包嘛。如果他是这个类型,好,那我就非常高兴,他就是告诉我有用户的状态发生变化了,那么要的就是他呀,诶我们要的就是它,所以说这个时候呢,我们就直接在这里做一个控制,就是它。如果他是这个消息,那我们说你,诶,他是要通知某个人上线了,还是就是有人上线了。有人上线。好,那有人上线了过后呢,你要做什么事情呢。好,你肯定要做处理,你这肯肯定要做处理。对吧,好,我们再写个default。啊,Defat,我先把这个架子搭起来,Default如果是default呢,说没有匹配的,就返回那个消息,但是这个类型我们不能识别,那我就写一句话嘛,也提示他一句话,说你返回了一个我暂时不能处理的消息类型,比如说你服务器端写了东西了,但是客户端是另外一个张三在写,他说诶。
03:17
这个类型我不能识别,我还不知道怎么干呢,所以你可以提示一下,就是服务器端。服务器端返回了,返回了,返回了一个我暂时不能处理的消息,未知,返回了一个未知类型。未知。未知的消息类型。好了。嗯,那么这个处理完了过后呢,哎,处理完了过后,同学们,那这里面要写代码,大家想你,你这应该怎么做呢?既然别人已经把消息给你了,你肯定要想办法先把消息取出来,然后进行一个改进。好,代码呢,到这来了啊,同学们现在已经拿到消息了,你要做的事情其实是这么两件事,注意听啊,我给大家分析一下你要做什么事。第一件事情取出。
04:09
取出这个notify message,你要可以把它取出来。因为这个notify message里面包含了一个用户的ID和他的状态。不就他吗?不就是这个东西吗?哦,有ID有三,哎,有ID有三。那就说明我知道有一个人。来了,但是这个人来了过后,你你怎么处理啊,你不能把它直接显示上来,这个地方就意味着第二个动作来了,第二个动作啊,注意听。就是说你拿到这个取出它第二步你要把你得把这个人。你得把这个人加入到你本身客户端维护的那个map里面去。因为因为人家来了嘛。
05:01
你肯定要把它加进去啊,比如他的状态是什么,因为我刚才讲过,刚才我的一个重要的思路,就是说我的思路是让客户端也维护一个脉搏。你不维护他,你不维护他,每次那服务器只能硬生生的把所有的全部给你返回,你这个代价太高了,所以说呢,现在我们还得有一个事情,干什么事情呢,这分析出来了把。把这个用户,把这个用户的这个信息或者状态状态。状态干什么呢?状态保存到保存到我们客户端的麦头中。问题来了,卖你有吗?你根本都没有。你在脉部还是个空的呢,所以这你你分析到这地方,你马上觉得脉部还没有写完。所以说现在呢,你要先不能着急,你还得先把脉写出来。所以说你看这个代码就感觉有点跳跃了啊,有点跳跃就是突然一下,诶怎么到还要写这个东西,那回头又回头写,然后那边还有服务器那边我还得管。
06:08
所以说,所以说这个写网络通讯的时候呢,一般如果是两个人写的话,这个两个人写的话,这个项目经理最主要的责任就是先定这个协议,就定好我给你什么,你给我什么就完了,我也不问你要什么,他事先说我给你那个message是这样子的,你返回一个什么东西就可以了,其他我不管。当时我们在在做那个经开协同之星的时候,就是这样定的,就是。我们那老大就说一句话,就说我给了你这样一个包包,你返回我的格式是什么就行了,至于你怎么返回,那是你的事。啊,那是你的事好,现在呢,我们没有办法,我们现在还得搞一个迈步,这个脉谱刚才老师已经分析出来了,它是长这个样子的。它是长这个都行的,有个int,还有一个user。还有U,它里面保存了很多U,好,那这个时候把它放在哪里比较合适呢?各位同学,现在呢,我们整个这个东西,我们也需要写一个专门来管理这个东西的一个文件会比较好,所以说我新建一个文件。
07:11
叫user,也叫user m grr点购这个呢,跟服务器不一样,是他管理是客户端的user。管理啊,管理就是维护,这个呢,是他一直在的,好,我写个package。它的包包是什么包包我们看一下啊,稍微有点麻烦啊,同学们不着急啊,一会儿写完了大家就。大家要看到这个好好好玩的效果呢,你得前面这个就是要付出一点,付出一点把这个写完,再写一个聊天,大家基本就通了啊,就是要通讯这一块,你们基本上以后就可以说,假设你将来做,因为我们公务员最核心的功能大家都知道是做服务器的,服务器里面最核心功能就是数据通道,如果这个不奖励最精化,不奖励你白学了,老所这个东西是不是购源核心绝对是核心,你想通讯协程协议后台的服务器全都在这了。
08:05
你个原学的精华就这,比如我们学Java Java要学好学到位,面向对象,它整体的东西全在网络那块,全部体现出来,什么面向对象文件的操作,数组的操作机机制,包括你的这个思维的锻炼,全部在这儿,所以所以说你看为什么很多老师在讲这个,讲这个假话的时候,他一定是把这个最重要的放在这个。就是全部都学完了,包括什么多线程,学完了才去讲这个多线程,多线程的一个坦克搭讪什么的,那是比较综合的一个东西。包括你的文件都数据库全部都在这里面,所以这个案例还是很重要的,大家不要觉得就是说好像这这个是不是没什么用,他就已经是核心了。你比如说天天写个见面,那没用,那那个是前端前端的前端的人干的事啊,好,那现在我们不说废话,我们接着往下走啊,说老师强调的重要性,好,那我现在写的是这个your manager,那我就写到这,那么现在呢,因为他肯定要有些import嘛,我就写到这了。
09:05
好,那写到这个地方来了,过后啊,同学们。啊,写的问题,这人我应该怎么办呢?好的好的,既然你现在已经要做这件事情了,你说要去保留它,那我现在先给他定义一个东西,我先把这个我要维护的客户端,注意听这句话啊,客户端要维护的,要维护的这个一这个map我先把它搞出来,因为他肯定要用,要维护,那既然要维护就不用不犹豫了,就叫一它,它其实也是维护一个在线的。用户啊,所以这个名字呢,就有点有点这个容易冲突啊,但是呢,它是两个,就是客户端的这种服务器端的啊,那我还叫刚刚有是吧。好吧,但是他的长的长的样子呢,有有些变化,这里面是维护的优点。OK,这个UR里面是没有连接的啊,同学们,这个UR没连接好的,那有这个UR过后呢,我们上来过后就直接先给他make一个。
10:04
Make一个空间要make一个,它是切片吗?啊,他不他他他他是map嘛,他是map也也得需要给他给他来来创建一个好创建一个吧。好地方是不是也可以整个指针比较好一点啊,整个指针吧,所谓放个指针也行啊,放个指针我看看我以前是放的什么啊,我以前放的指针,我也我也还继续放指针,如果不是指针,我就换一个,我看看以前是放的什么东西。Online user啊,OK。哎,我看是放的是指针吗?放到哪的。A。中间这个地方,Notify。右面这个吗?啊对对,你看我也我也放的是指针哦,我也放的是指针,好所以那这样子我们都都放指针吧,放一个指针还效率还高一点,但是这个这个UR大家也看到他是在message这个包包里面对吧,所以你你得这样子才才正确好最后呢,我们给他呃来一点吧,先给他创建十个啊,假设他有十个好友啊,以后不够它会自动加,然后呢,这块地方也是一样的道理,把这个整整个粘过来。
11:13
好,放这儿。好了同学们,这个就就有了,那就有了,过后问题来了,你这个你这个客户端要维护它的话,它初始化的工作是在哪发生的呢?你看啊,它后面是来一个加一个,但是它初始化的工作是在哪完成是比较合理的呢?显然,同学们大家还记不记得?我们这个客户端在登录的时候,他第一次登录的时候,他会首先把把那个服务器,服务器那个所有在线的那那他关系的ID整个拉下来。那个里面有个user users ID的切片,就他初始化的工作应该是在他登录的时候给他给他搞进去,因为他第一次登录的时候,他会把所有当前在线的人先一一股了,全部全部扯下来,所以说呢,这个初始化的工作呢,我们肯定是要在这做的,同学们在哪里呢?在他登录成功以后,直接把它拉下来,在这儿大看在这儿你看啊,当你等于200的时候,你已经把所有的用户在线,其实已经拿拿拿过来了,它不就是这个V吗?好,所以说在这个时候我们把它完成一个初始化是最合理的。
12:21
但是你要分析的出来哦。啊,包括你们以后写数据通道,你在服务器写数据通道,就这样子的写数据通道的,现在现在的工资都都还比较高啊,所以说这样我们完成什么呢?完成初始化,完成我们的。这个刚才写的online客户端的客户端的一个online online这个user看名字叫什么取的叫什么名字啊。Online user这个地方。客户端。这这别搞错了,别别跑到那个服务器端去了啊。好在这在这给他完成一个初始化,对的,完成一个初始化。
13:00
完成初始化。就在这儿,就把东西先装进去。好,那怎么把它装进去呢?那就是刚才我们这个online,因为它的现在是同一个包包。都在process这个包,所以说呢,那就直接按那D它的这个轴,嗯,你这取出来这个地方啊,已经是这个V,这个V就是ID,就是那个客户端服务器端维护那个V,那你可以把它先放进去。喂。好,然后等于。他的这个userr,但是这个user现在还没有,所以说你只能先重建一个。因为现在U没有,就来一个你根据ID给他给他搞进去就行了,好那这样子就做一下啊,所以还得创建一个UR。每来一个我就搞一个user,每来一个就搞一个user,那么搞一个user呢,它人它的类型呢,仍然是message.user好复制第一个呢。就这个UR里边,大家看这个user,你能拿到信息有哪些啊,就message user里面信息。
14:01
看这。呃。这个UR这个userr里面有URID我们是可以拿到的,它的密码,它的名字,它的状态状态我们应该也可以拿得到,因为你返回的时候呢,呃第哦,第一次那个登录的时候,我好像还没给他返回,那默认就是在线吗。我就就这两个信息是可以拿到的,但是密码和名字有可能服务器并没有给你返回。但也服务服务器将来应该也要返回这个名字,我才知道你是谁,好像是就就很轻松了,相当于说我我的客户端这边可以知道我好友的除了密码之外的所有信息。好,这样相当于你你客户端这边也维护了一个列表,好这样就对上了,好的,那既然如此呢,那么我们就回到这边来把它搞进去就行了啊来user。User ID这个ID呢,就是这个V没问题,好紧接着呢,User的一个状态status,好,它的状态呢,各位同学,它的状态我们就默认为上限,因为我就认为默认上限啊,我没有没有考虑那么复杂,考虑复杂的话,那就多了QQ,你你看简单吧,腾讯将近有几几万人在在写QQ啊,全都是在在在干干的事。
15:17
所以说我们这不可能考虑那么细致啊,Message先扔进去,Message me点它的一个状态,就是一个在线的状态,这儿不是定了一个吗。我不定了,一个就是online,好,我把它扔进去。好写完了,那这个写完以后呢,这个时候好,我们把这个UR给它扔进去就可以了。它本身就是一个指针啊,说重击好同学们看,也就是说当我登录的时候,我已经把这个online这边我们这个online user给初始化了,那既然初始化了,好同学们,但是说以后至少有一点可以肯定。就是将来呢,我想去看我现在有哪,我维护哪些人,我直接把它提出来弄一下就行了,好现在回头回头到这来了,回到这这段的代码是因为。
16:08
因为。保存一下。好,现在这边我们的方法有了啊,现在都有了,现在就就差最后一点点了哪一点了,Server这一块。你server登录以后。啊,服务器端啊,客户端,客户端你在这儿,你在这儿有一个偷偷跑的这个server,现在就说怎么去处理。好,现在呢?把这个用户状态保存在map里面去。保存这去。好。那你把这个状态保存到这里面去,怎么保存呢?好,那我就专门写一个方法来做这个事情。它不是那么简单的,为什么呢?因为它返回的是个消息结构体,它不是一个简单的UR,所以说你还要对它进行一个解析来处理好,现在的代码就开始这样写了。啊来,在这请。
17:00
编写一个方法啊,处理处理返回的,处理返回的什么呢?好处理它返回的这么一个信息。就是刚才我们说的这个信息。好,那现在如现在这样子的话呢,老师就这样开始写代码了啊,那回到这地方,我们写直接写个函数function。好,这这是个函数,我就不跟别的绑定了,我是一向是update。我直接取个名叫update update什么呢?Update这个user状态。Status。好,你给我传一个东西进来吧,你给我传一个什么呢?你给我传一个,呃,我需要这个消息种类就行了,比如说你给我传的就是notify的这么一个消息,你给我,你给我,我就能处理好它的消息,就是notify user standard message,好,它的类型大家都很清楚,是message包包me s,它是个指针。
18:00
给他一个指针messages,点里面的这个notify这个类型,好大家看能不能看懂,好那么更新的时候怎么更新呢?其实说说的简单一点,就是直接把它扔进去。但是这里面又有很多复杂东西要处理了,你直接扔行不行?大家看啊,简单来说肯能就这样写。这样写说,哦,你这个notify,因为notify这边已经能够拿到这个人的ID了。ID了,好呢。Userr,你肯定要构建一个user啊,你肯定要构建一个,因为你这方字返回一个ID和它状态user是没有的,所以说你还要构建一个user。这个很简单,就是等于怎么写呢,就直接。来六一个,就把刚才这句话拿过来就可以了,我刚才这样写的啊,待会还要调整,我这写了个message。点。User,好,它这里面是有个ID的user ID轴,这个ID其实就是它。
19:06
相当于,诶这写错了,这个地方应该是少写这个ID有点ID好,相当于说是你返回来的消息里面,大家在想你你返回消息长什么样子啊。你你返回的消息里面就带一个ID和一个状态,所以说我把它给他状态,也给他一个状态是user status。它的状态呢,就是这个notify里面取出来的一个状态值,因为它带过来了,这个应该是单,我觉得是这样写的。好,有问题再调一下,好把这个U给他就可以了。把U给他就相当于更新,但是这样写是有问题的,这样写有一个什么问题呢?我看看这样写行不行啊,就来了一个,我先构建一个UR,把它替换掉,好像应该也没啥问题,即使他以前存在,也相当于把它给更新了。应该是这样子的吧,它有两种可能性。
20:00
第一种就是说你。第一次来,那第一次来的话,我就会把你加进去,没问题,如果你是第二次来,比如说这个人原先是上线,现在变成变成一个D人,好,那我相当于说把它消息又拿到,创建一个新的,有点帮你,但是这有点浪费,这个代码呢,效率有点有点影响。所以说呢,这种写法呢,效率有点影响,我稍微把它优化一下,我这样写啊,同学们看大家看这样代码怎么写,因为我这样写法就没有考虑它原先是不是已经存在这个这个UR了,你不知道写的很死这个方法,所以说我们来进行适当的优化。适当的优化一下。我这样写的代码,它的它的缺点是什么呢。缺点就是说你你默认它永远没有,但是其实有可能是将来是存在的,因为我叫update。我并没叫爱。那将来这个用户假设原先是在线,现在变成变成一个busy,那你也把它加进去,不是相当于重搞一遍吗?不划算,我这样写啊,User。
21:05
走。User OK,看下我代码。有点OK,然后呢,我先从这个map里面取一下,看看有没有,大家看我的这个逻辑行不行。我也说我先取一把。我先看看你给我传过来的loading,这个loading里面这个user。这个这个ID我有没有。点它那边不是传了就是ID吗?好,那这样就有两种可能性,一种是有,一种是没有,如果OK。这说明他原先没有。这说明他原先是没有的,原来没有,那如果原来没有的话呢,诶我才去创建。大家看我的逻辑啊,我这样写,我才去创建。相当于说把这个东西给它创建起来。那这个时候呢?诶把这个东西创建起来,创建起来过后再说,如果他有。
22:00
如果有的话呢,你看如果他有的话,其实我就是找这个ID把它状态更新一下就行了,相当于说这段代码只需要做这样工作,再看user,看看这个代码能不能看懂啊,User里面它有一个状态。他看见这个代码应该看起来更更好一点吧,等于新的状态。当然里面这个代码我就拿掉了。里面这个代码就拿掉了,大家看我的逻辑是这样写的,先取出来看有没有,如果有ID,不用变化,直接把它的状态一改变就完事了,再把它更新一下,如果没有,没有我创建这么一个东西,把ID给他,再把这个状态更新就行了。大家看这个逻辑应该比刚才那个更应该说更合理一点吧。应该更合理一点,好,这个代码我就写完了。这个代码写完了,那么写完过后呢,这边有些包包没有引入,我们先把包包引进去啊,不着急,还有一点东西啊,最后一点,最后一点的疯狂。
23:05
但这个大家可能也有有有有点手表了,对吧,不是也可能不知道老师在讲什么了啊。我估计是有一部分已经开始听不太懂了。但是呢,没有办法,我们必须要讲一点这个东西。好,这个呢,这封脉还没用到,待会再用好,你光有这个优化没有用啊,你得把它展示出来,最后要看效果呀,所以说我再写一个函数。我才写看书,因为你现在只是更新嘛,就说来了更新一下,但是你没有在界面给他打出来呀,说我再写一个方法就显示。显示当前在线的这个就是当前这个在线的用户在客户端显示啊,在客户端。在客户端显示当前在线的这个用户。OK,那其实我就写一个叫output output。呃,这个阿online阿有点。
24:01
啊,那一人就是我现在呃,在线的这些人,我有哪些,那这个就很简单了,这个呢,就直接把它取出来便利一下就可以了,非常简单啊,就遍利一下就行,便利一把。注意听啊。便利一把。便利一把,什么呢?这个online user就行了。好,那第面呢,就for嘛,For,呃,这面这个ID和这个user里面,比如说你还想显示这个用户的其他信息都可以从这取了,那这种设计还是比较合理的啊呃,那么第一个是ID取出来,还有一个呢,就是它的userr也取出来,对不对?好然后呢,Range。润治谁呀?显然就他。因为它是个全局变量。所以说我在这用是没有毛病的,然后我这打一句话说,当前在线用户是。当前在线用户列表。好,马上就要看效果了啊,马上就能看到效果了,那写了这么久一点效果没看到。
25:05
嗯。ID有了吗?那就按照这个格式写就行了,走ID就是。用户ID。等于啊,用户ID拿一个。拿一个这个,呃。嗯,我看看啊,咱们来一个这个东西就先安吧。啊,斜杠斜杠斜杠T再拼一个。就是ID打出来。哎,你就这个这个在线的用户ID就有了,但是有一个人呢,看看你们要不要显示,就是自己要不要显示啊,自己要显不想显示自己的话,可以过一下滤啊,如果如果不显示自己不。不显示自己可以过下率啊过滤,如果你你要显示的话呢,也可以啊。这里面没有自己是吧。哦,我已经过滤掉了啊,过滤掉了,那就那就直接显示了,直接显示好,我们把这个都写完了,写完过后,那么你在更新以后,各位同学,你在你在更新以后状态呢,你顺带把它给掉下。
26:16
就你把它更新完了过后,你顺带也调一下这函数就在写,就更新完了后,你顺带调查一下这个函数就行了。好。这地方就写完了。那写完以后回头到这个server,你还没掉它呢。你这还等着掉呢。好,那么你这帮拿到这个notify过后,人家这个地方就是你这个地方要更新的时候,是要传一个notify message,所以说你还要把它反序列化一下。你要把,因为现在这个Mac已经拿到了,你再取出里面load地方就可以了啊好好吧,这个呢,我们做一个简单的处理,怎么处理呢。他这个类型。
27:00
先来一个楼梯。然后它的类型是message me。第二这个类型。然后呢,反学的话,反学的话我们用了很多遍了,其实。JA jason.on Mar。然后呢,这个地方我们是。是已经有这个message了。Message里面有个data。哦,是这个啊,是这个是写错了,是这个message。Message里面这个data就是它的数据本身,好,然后呢,我们把它搞成一个。反虚的化的时候,是要做成一个切片类型的数据,它才能反虚的化败。包起来。好,包起来,过后我们再把这个放进去。一个引用的方式放进去。好,放进去过后啊,这地方是不是多写了一个,多多写了一个玩意,好好这样写完了过后呢,再调用它就行了。
28:02
调用谁调用,调用我们刚才辛辛苦苦写的这么一个方法就完事了。我们刚才写的正常更新。好,更新就到这儿了啊,来把它放到这儿。那调用是只要把这个传进去就可以了。好,同学们,我们来看看现在效果出来了没有。哦,麦应该没赢吧?Message是美,果然是没有message,好把我们的message影响common Co m mon on,然后这边呢,是message。Me再保存。好看代码有没有毛病?好,还有两个错误,看语法是哪地方有问题啊,即使没有引爆。杰森包没有。好,来,走一个codingcoding。N coding,然后呢,这边这边我们把接引进去。
29:07
扣节省。好保持一下。好,看看还有没有代码,诶怎么还有错误,扣里还有错误。他说这个a marha还少了一个N啊,少了一个N。好的,这边是没有引用。他说这个update这个类型好,我们看这个是难道少写什么东西吗?哦,它是个指针类型,对吧,它是个指针类型没问题。要我传传一个指针过去给他。好。还有一个错误。哪里有错?看看for循环,他说user没有使用过,那就暂时不用吧。暂时不用吧。
30:01
好,再全部保存。全部保存呢,大家看一下现在呢,应该出现这么一个效果。就是一个客户登录以后,另外一个客户一旦出来登录过后呢,我这边客户会马上看到有一个新的用户上线了,就谁谁上线了,最新的列列表我能看到,我们先来测一下。好,现在我们能看到效果是什么样子的啊同学们,就是说当有一个用户上线后,比如说A上线。B上线C上线呢,我A和B能够看到当前所有在线的用户。同时当然他这个B也能看到,B也能看到,好,那现在是不是能达到效果呢,不知道。可能还需要。走一走啊,这个东西。不好说,我们来我们来玩一把吧,现在把这个服务器端和客户端我们全部重新编一下,看效果编了一把啊。
31:03
好,这个代码有些错误。他说,在user process的23行服务器端,我们这边还有问题。第23行。23行。他说。你这个。我们看一下啊。这个我们当时定的这个online user是在哪里,是在这个地方是吧?哦,这个是有问题的啊online user,呃,那么这个地方我们是应该是一个全局的,我们当时定的应该是全局的,对不对,所以这个应该是写错了。是从这儿取出来的啊,这地方是确实写错了。保存一下。好,当时他也没给我提示,好,我们再来编一下。再重新编。中。
32:00
好,编译呢,现在没有错了,服务器端过了啊好,我们先把它拿到这边来。服务器端过了,我们再把这个客户端也重新编一下退。他看清楚了。客户端。客户端编译呢,也没有任何毛病。好,客户端没有毛病,再把这个客客户端也打出来,我两个客户端。都好,这个客户端就不用不需要再再去编译了,来同学们看一下效果到底有没有,有没有像我们想象的样子啊,能不能。跟我们想象的一样呢。好,我们先这边来登录一下,我们现在有一个100号,还有一个一一个200号来。走。我们先输入一个100号哦,我们先输入登录。100号的客户登录。老输一个密码,123456走。好,他说我这个地方有个错误,他说没有办法连接到8889 8889是不是服务器中还没启动啊。
33:06
设备服务阶段还没起来啊,果然是没起来。没有起来呢,你先把服务器端启一下,报错是正常的,因为你服务器都没起来,你怎么能连得上呢,Server。点exe回车,现在12呢,是在8889这个端口进行接听,我们再重新来登一下录。好,重新来一下,争取一次性过啊。登陆走100。密码123456。成功了。同学们可以看到,目前。他说在线用户列表如下,没有正常,因为只有你一个人在这玩吗?所以说很正常,他这边也说谁谁登录成功,看到没有,好,紧接着呢,我们让他再来登录一次。看效果啊,同学们现在呢,我输一个一,我让200号来登录。
34:00
它是一个123456,注意我先不回车,大家想一想,如果我一回车,那么会出现一个什么情况呢?他应该在这个地方看到有200号登录成功了。才正确回撤。果然看到他说用户ID200号登录了。那么200万的路沟呢,它这个地方看到啊。他这个地方。没有看到新的消息。他说诶,我我看到一个他哦,他登录过后,他是不是看到一一百号也在登录啊,这个时候我们应该再加一个小小功能一下把它做出来啊,我输一个一。我这边输一个一,我能看到除了自己。除了自己以外的所有在线用户,这个把它快速加进去就完了,很简单,就显示在线用户列表,这个工工作怎么做?这个代码呢,非常简单,只需要找到你的server。
35:01
大家看只需要你找到客户端server,在这个地方加一个逻辑进去就行了。你现在不是这。在线用户列表吗?你只需要加一个动作。把这个去掉。调用一下我们这个方法就行了。你先输一个一好,我调用谁呢?调用这个user manager里面的这个方法,Output on online。因为这些呢,就是你你应该想象到,到它掉的时候,其实这些东西都在里边了,好,我们再来玩一把啊好。再来玩一把。还算是比较幸运,就说咱们一次性就过了啊,过了还是比较幸运的,来我重新编一下。我把这个客户端这块重新编一下啊走。重新编译。编辑过后呢,我们来启动一下。走启动好,我登录一。100。123456。
36:00
好诶,你知道为什么他能看到200吗?因为我服务器没有关闭过,服务器没有关闭说明服务器那个列列表还在,还在工作中,所以说我把服务器要关闭才能看到这个一个完整的东西啊,再重新来一下。你看这个写这个网络编程,它恐怖的事情在哪里呢?就说你一个人要照顾两头,你一个一个人得照顾两头。说这个难度肯定是要大一点的。来100。123456好,现在呢,应该一个都看不到,因为它不显示自己,我自己没有显示自己,我再登录。好,这个时候呢,我再登录200号。注意看啊,我输200号走123456回撤,好同学们看到我是200号登录,我看到100号,他是100号,他看到200号正确,那现在呢,我们假设再想看一下,如果我输一个一。我应该还看到100号。因为我那个链表里面已经维护了这个信息。
37:02
大家看我还看到100号,同样我这边输一个一呢,我还能看到200号,因为我的map里面也维护了200号这个信息。大家看果然是,那我再来一个用户看对不对啊,最后一个把这个撤了,只要三个人能够玩起来,那么就应该没有大上的逻辑错误了。好,再来CMD各位同学。CMD各位同学。好,那这个时候呢,我们再来登录一个人。走,那么现在因为只有两个用户,我先注册一个用户。比如这是个300号,这个人的密码呢,假设也123456,我不写那么多,好,然后他的名字是SC回车好,他登录成功了,登录成功我再来注意看啊一。好,300登录。然后呢,密码123456,注意我先不回车,大家想想情况是怎么样的,我一回车这边应该看到说。
38:01
最新的用户列表,他应该看到100和300。这边呢,也应该马上,这边应该马上也看到最新的列表,因为他现在其实一直在等待那边。读东西呢,是这意思吧,所以说这样我一回车,你们看到两头都应该马上有反应,而且他们看到列表是不一样的,这边是100和300,这边是200和300。回撤。看到没有200和300 100和300正确,那我这边一一输一个一,我应该看到几百和几百呢,应该是100和200,因为我不看自己嘛。回撤。果然看到100,也就说看他是300号,他看到100和200,他是200毫看到100和300,它是100毫,看到200和300好。代码就OK了。那现在当我们把这条线打通过后啊,同学们,你们可以想象我们可以做什么事情呢?我们可以做很多事情呢?就是说因为你现在已经可以看到用户在线了,那如果用户离线你们也可以做,为什么呢?他离线的时候,他发一个包说我要走了,你只需要在服务器端把这个人找到,把它给列子就行了,现在接口就全部写完了,所以你看我们前面现在代码写的比较多,是有些呢是他预留的功能要用到的。
39:20
好的,那我呢,把这个代码简单的给大家整理一把啊,整理一把,我们看我们到底做了哪些工作,我们看一下就为了完成这么一个玩意儿,咱们写了多少功能呢?写了好写了这么久对不对。但是这个没办法,就说你将来做数据通道,你将来做构构语言的这个服务器,你肯定要用数据库啊,要用这个数据,数据通讯跑不了,因为go语言它其实它本质它有一部分C语言的特性,如果你是做过C语言的都知道,咱们班有同学做过C语言。这生意面出版了这种福气。C源主要做服务器,谁谁做界面呢?那输出服务器肯定要跟网络和通讯打交道,说这个机制大家一定要去深刻理解啊,这个东西我说了啊,必须把它深刻理解,你只要把这个说,你说韩老师,我把你讲这些东西,我能够不看你的,我全部消下来,我告诉你,你够语言,包括你的整个整个思维绝对上去了啊,就敢这么说对吧?好,那么我把这个思路给捋一下,我们干了什么事了。
40:23
我突然发现自己都不知道干什么事。这书好像比较比较多的样子吧,那我们一起捋一捋啊,他们到底干了啥事呢?我们去做这个事情。好,我们现在捋一下我们,我们是,呃,新的用户上线以后,对其他登录用户可以获取到最新的在线列表,好,我们想起来了,我们首先是。我们首先呢,在服务器端做了这么一个东西,大家看一下,你要不把这个思路履行是后面就是变成粘贴口味代码了,知道吗?好,我们首先写了一个UR manager,我记得是。哎,写了your manager这个东西呢,呃,是有的,因为它是要维护这个在线的信息嘛,啊这个前面已经写过了,没有动它,然后呢,我们紧接着写了个,在这写了一个关键的两个函数,一个是notify other online,一个是not me online,那这地方还有个优化的地方啊,同学们到时间可以去。
41:21
补一步,好,我先写到这里啊,第一步,第一步啊,我把思路捋一下,Server里边有个process,我们在user process订购,我们增加了一点代码。我们增加了两个特别重要的方法,哪两个特别重要的方法呢?诶一个是这个notify other,就是这个东西,你你让别人通知你,哎,你让别人通知你,好,这是一个方法,对,是这样子的,然后呢,我们在这个基础上还增加了一个方法,就是为了让代码呢,没有融在一起,我我把它分开写了。啊,这也是合理的啊,这是合理的,好这个地方我们是从这个33行开始的。
42:05
二三十三号开始。好,那么这是57行,对57行,然后接着往下截取57。好,然后呢,58到最后哈,到最后。好的,这个是我们在这里面加的方法。那么这个方法完了过后,我们在哪里调用的呢?诶我们还改了一个地方,你写完了后,你的调用它呀,我们在哪调用的呢?我们是在它登录成功以后来调用的,就说当一个人登录成功过后呢,让他去告诉别人我上线了,诶在哪里写的呢?代码就在这里写的。其实就掉了一下而已。调了一下,就这么一简单,就是通知其他用户我上线了。那这个地方是在我们的,也是在这个user process里面啊,但是呢,它是在这个,呃,Log那个函数里边,好我写到这里,好在还是在这个server。
43:03
Serve serve,然后呢,是还是这个user process。点勾理念的哪个方法呢?的这个方法,但是那个啊那个这个是那个捞紧那个方法,处理捞进那个方法。确定捞金方法。好,然后呢,我们把这个代码也给他拿过来,服务器端呢,主要是做这个东西,那么可还有一个地方,就是为了支持这个整个这个通讯呢,我们在common这个message里面,我们增加了这么几个东西,一个是增加了notify user standard message,而这个呢,肯定要加进去的,不加你整个这个通讯没有一个消息结构体跑不起来,所以我们在这儿呢,还加了一点东西。好,我把它整理到这里,是哪里呢?是server里面的啊,不是server里面的啊,是common。Com mon里面有个message message里面呢有个message.go对,在这里面我们加了一个东西,对吧,各位朋友。
44:06
非常的简单,当然客户端我们做了哪些工作呢?客户端呢,代码其实并不多,但是思路很重要,我们首先搞了一个,也搞了一个卖里面做了一个客户端要维护的迈步。这个map步呢,我们是专门维护,就是他客户这个客户端关心的那些个用户,对吧?好这个呢,我们是写了一致二字的,好把它写进去,在客户端我们写了一个新增的。先process,下面呢,我们写了一个东西啊,叫做user。MGR订购好,它是专门用来管理这个在线的啊,在线的这些用户的一些信息,好这是一个这么一个东西,好把它复制过来。好的。好,这个地方我们复制过来。第26行对第26行。
45:01
然后呢,第26行过后呢,我们又把它往下拉了一下,诶做了一点小小的优化。对,做了小小的优化,把它放进去。好,然后呢,这个地方写完了过后,你得调用一下呀,我们在哪调用的呢?好是在哪里调用呢?它的调用其实是在这个客户端的一个购物携程里面玩的,也就是在server这个地方玩了一把。这个地方。下面这条这地方是很关键,就是说因为你在这个地方,你才能够去处理它,所以说我上来过后呢,在这偷偷的看,诶你到底给我返回什么呢?如果是no地范,我就去更新我的这个在线列表,如果不是,不是就算了,不是的话我就干别的事,那么将来大家可以可以想象到我们将来群发消息或者叫私聊,肯定也是在这加一个kiss。因为你这个倒进是后台了嘛,对吧,那保持通讯这地方肯定在这儿,所以说我们在这加了一段代码。诶,找到他啊。
46:00
这个地方我们加了一段代码来处理它的这个流程,这是我们新加的。好,我把它放在这里啊,这地方是准确的说是在我们客户端sir的一个叫process process.server.go我们做了一个处理。就他。让他来处理他的写真,最后一个呢,最后最后一点呢,啊,在server地方,我们为了能够支持当用户输入一的时候,也能看到最新的在线列表,我们在这儿做了一个改进,调了调用了一下它。好。好,我把这个呢,也给大家放到这里来,诶在这呢,我们做了一个小小的调用啊,小小的调用我放在这里啊同学们。好,那地方我们写的是哪里呢?就是client端的,Client端的process process server.go好调用弹一下,好同学们,那关于这个登录就是看在线用户的这个功能,我们就给大家讲解到这里。
我来说两句