00:00
好,各位同学,现在呢,到了我们一个比较关键,也是相对来说比较麻烦的一个地方,哪里呢?这里看这个代码你明显感觉到比刚才要多一点啊,多一点,嗯,这个地方呢,我们还是完成这个登录在线的登录的问题,我们要完成这样一个情况,第一个当一个新新的用户上线后,其他已经登录的用户。也能够获取到最新的在线用户列表。什么意思呢?就是说当一个新的用户上线以后,其他的登录用户也知道你上线了。他要通知别人。就他要去通知别人,他要通知对方。他上线了,好这个地方的话呢,同学们要想啊,这个怎么做。就说比如说我张三上线了,打个比方,我我举个例子,比如说张三这个AA上线了,他就要告诉B说我来了。那B上线了过后呢,他还告诉A,反过来也是一样,假设A上线了,下面有十个人,比如这边还有客户端是CDEF,那你就要通知其他的人,我我来了,并且你的列表要有所显示。
01:15
就这么一个小小的功能,但是你想怎么做?琢磨琢磨,这些事儿怎么装?哦,OK。怎么想这个事情,大家先想一想啊,好,我说一下这个思路啊,同学们。这个思路呢?是这样子的,因为你这个A,比如说你B客户端上线了。A,客户端上线,你只能通过服务器。去发一个推送消息给各个已经上线的客户,说有人上线了,赶紧去更新一下你的这个在线列表。赶紧去更新一下你的在线列表。OK,那大体思路就这样,那你你客户端怎么做呢?第一种方案来我们说一下这个思路。
02:04
这个思路呢,每个人可能都不一样了啊,但是呢,哪个方案更优秀,更更好一点,咱们就要动脑筋了,哎,我们来说一下解决什么呢?解决这么一个问题,我们先说一下要解决的问题是当一个用户上线以后,其他登录也能拿到最新的用户列表信息。好,我们来。动动脑筋,我们来动动脑筋啊。首先第一种思路,大家最容易想象的这种思路。思路一,你看好不好?这个思路一呢,就是刚才呢,呃,就是我们大部分同学可能会想到这个问题,比如说很简单嘛,就说有一个人上线了,有一个上线了啊,我就告诉你们都上线了,这是一种,就是第一种,当有一个用户上线后,上线后我就就是服务器干什么呢?服务器就就马上马上把维护的。
03:04
维护的这个online online online注意听啊,就online user这个map。Map整体推送。Map整体推送。整体推送。推推送。就说有一个人上线过后,比如说张三上线了,我就便利,我就便利一下,现在卖有哪些人啪把这个把这个包蹭蹭蹭的发下去。假设你在线用户1000个人,我就发1000份。对吧。这是一种思路,就是你有一个上线了嘛,还有一种。还有一种。就是当。有一个人用户上线,我也不管,我不管我干什么呢,我有我自己的节奏。你上线我也不管,然后呢,我在这个服务器起一个timer啊,起个timer这很简单啊,Timer就是就是定时器,你们学加script的时候呢,肯定学过类似的这个东西。
04:05
我起个time,我我定时的去完成这个群发任务,或者是什么呢?第二种思路,思路。二就是。我这个服务器有自己的节奏,服务器有自己的一个策略。他策略是什么呢?我也不管你上不上线,我每隔我每隔一定的时间。一定的时间。把什么呢,把这个把这个服务器维护的,把维护的这个online整体推送,因为这个。因为你这个人上线了也好,还是变化,呃,状态变化了也好,他会通知到这个online嘛,所以说呢,我也可以把这个推送数据,那这样想一想,你你这个代价可能比我刚才那个更高。因为我这个上线,我这个才上线推推一下,你这是每隔一定时间推一下。
05:01
因为你不去管吗?那每隔多长时间呢,十秒。还是?30秒。这个量是很大的,你看啊,一般的像这种聊天的,一般在线十万人,那是很轻松的事,像QQ。他上线,他在线有时候就是几千万人。那几千万人的话,你就翻下去,很恐怖的。说你上来过,你你你的好友列表呢,每个人的好友列表还不一样。你还得把他把张三的好友列表扔出来,把李四的扔出来,然后啪啪啪还要发,其实是一个很复杂的过程。所以说这这两个思路呢,虽然可行,但是呢,代价比较高。所以说我的一个思路呢,这样子的同学们这个思路呢。这是我自己的,我们自己来考第13,大家看看行不行,这个思路这样子的啊,同学们。我们呢?就是有一个用户上线过后。
06:00
他把他自己的状态推送给。在线的各位,他是把自己的一个状态,比如说我变化了,我就通知你们我变了。我就通知我自己,我并不会把这个online的整个人推送给你。明白我的意思吧,我的意思是这样子啊,就说当我当一个用户上线后,当然也可能是离线。但也可能是发呆。我就举一个例子,当一个用户上线后。当一个用户啊,上线后,我就我这个服务器啊,服务器,比如说这个这个用户是A吧,因为我这个没有一个名称,我不好描述服务器就把。就把A这个用户的用户的上线信息。这个他上线的这个信息。推送给。推推送给所有所有在线的在线的用户,当然如果你们再加一个功能说老师,我们不推送所有在线,因为他不是他的好友。
07:08
那你就把这个逻辑改成推送给他的好友就行了。因为我现在没有加这个好友,加好友那就复杂了啊,加好友更复杂,但是这个逻辑是一样的,就是当A上线过后,服务器就把A用户上线的信息推送给所有在线用户,即即可,我不推送所有的,那么这个就有个问题了。这边有个什么问题呢,就说因为你是单个单个推送的。那你以前原先的那个用户状态在哪去了呢?就因为因为因为A他要维护,他,比如说A上线了,他把这个A自己的信息推送给B,但是B他本身他还要维护他其他其他人的信息,所以说这就意味着客户端应该也有一个卖,他要进入。他现在掌握的这些用户的状态。
08:00
也就是说客户端那边也应该有个迈步来记录。他所持有的,或者他关心的。那些在线的用户信息,因此这边就有个逻辑,就是客户端,如果按照这个思路的话呢,就需要客户端,客户端也需要维护。维护一个脉部,那这个脉搏呢。就应该是所有他关心的,或者他的好友,或者是按照我们这个逻辑,是所有的人呢,他他维护一个map这里呢,保留了这里。Map中记录了,Map中记录了,记录了他的他的好友。好友,那放在我现在目目前我们这个情况就是所有的目前我们没有分好友,那么目前就是所有。好,那么你就需要去定这个map,就你在不停的维护这个map信息,然后呢,好当有一个变化了,诶我就把你的这个状态给你更新到这,你要看或者是要要更新,我就调一下你的你你你的一个一个方法把这个麦克里面取出来就完了。
09:08
这样子呢,就把一个重的一个服务器端的功能呢,分散给各个客户端了,我的服务器压力不至于那么大。OK,好,这是我的一个思路,那关键是这个麦部长什么样子呢?这个map呢,我觉得应该长这个样子啊,同学们。这个map你要分析出来,他应该至少也有个int。这是肯定的。你没有特,那肯定跑不动,那么这个时候这个map,因为这个map是客户端的了,他肯定不会维护这个东西了,他维护这个他也维护不到。他肯定不会维护一个这个东西,他他拿都拿不到,他怎么去维护呢?因为他是客户端,他只有他自己的链接,因此呢,他必须要去维护一个所有的U2信息。Find me no reason。也说也就是他维护的是他关心的人的这个信息,就可有了他的ID啊,他的名字,他昵称啊,他的什么东西就可以了,好,这就OK了。
10:06
好,我的思路就这样子的。那这个就看起来容易哦,听起来好像容易,那你实现起来啊。那也有点麻烦,而且还有第三点,第三点就是你还要搞一个事情,就是说当这个A登录,当这个A,比如说一个用户上线过后,你要想办法通知他推送,他怎么推送呢?这个就要用我们服务器端和客户端维护的一个携程就他。大家还记不记得我们曾经留了一个接口,我在登录成功以后。大家应该知道,在客户端登录成功以后,我起了一个重要的携程,叫server process message,这个携程就有重大的作用了。就他会不停的说,诶服务器有有有有人变化吗?有人变化好,我就干不了活,说这个东西就变得很重要,看该携程保持跟服务器端的通讯,如果服务器有数据推送给客户端,我就接收并显示。
11:08
那这个信息很多,比如说用户状态变化了,有人有人给我私聊了,有人给我群发信息了,还比如说有人说我我我要给你,嗯,这个这个开一个什么,开一个什么视频会议等等,那这个就就通过他来玩。所以这个复杂度一下就上去了,这个这个携程起来过后复杂就上去了,好那么第三点就是整个这个通讯机制要依赖于客户端和服务器端保持的这个携程。第三点,把这句话写进去,咱们就可以写代码了。还有一个重要点,就是这里有个重要的是整个这个通讯的机制要依赖于客户端和服务器端的通讯机制。通讯通讯这个机制和或者通道啊,通道通道。要依赖与要要依赖。
12:02
要依赖于哪个呢?这个携程。好了,大体的思路我已经有了。要大体是不是有了,但是你要说这个东西实现呢,那么得一步一步搞啊,那写好了就一步通过,写不好的话呢,那就切成条会好,思路呢,我已经有了,先把这个思路就说到这里。
我来说两句