00:00
各位同学,那么我们接着上一次课的内容呢?继续为大家来讲解这个海量用户及时通讯系统。那前面呢,我们已经完成了一个到服务器注册这么一个功能,对到服务器注册一个功能,那现在呢,我们完成这么一个功能叫什么呢?完成登录时能返回在当前在线的用户,甚至我还可以做的更好一点,我可以返回当前在线用户的各种状态。因为一个用户的状态呢,可能有很多种。他可能是发呆,也可能是吃饭,也可能是忙碌,也可能是在线等等,那么这些呢,如果让大家都能实现,你现在都可以搞定啊,都可以搞定,那么我们先来看看我的思路是什么样子的,我把这个功能呢分成两步走来,先谈思路。先谈思路啊,同学们,现在我们要做的这个功能呢,是这样子啊,就是完成登录时能返回当前在线用户。
01:07
那么第一个功能是当用户登录后,可以得到当前在线用户列表,现在说思路分析示意图和代码实现,那现在呢,我的思路是这样子的,同学们。这里面的问题啊,就说。当一个用户登录以后,比如说这边有个张三。张三通过这个客户端登录到我们这个。这个Q登录到我们这个服务器,那么登录到服务器以后呢。他应该怎么办呢?首先各位同学想一想,你的想法是什么?我是这么想这个问题的。但这是我的一个思路啊,首先呢,我认为在服务器这边,在服务器这边我们应该有一个。专门来维护当前在线的这个用户的一个结构体,那我姑且把它叫什么名字呢?我姑且把它叫做user manager。
02:13
User manager。Your manager mm gr.go这个用来做什么事情呢?它要完成这么几个功能,要维护。他要维护维护一个什么呢?在线列表,用户在线列表一维护用户在线列表。在线。在线列表。OK,那么你要维护一个用户在线列表,具体来说,你得有一个数据结构。那用一个什么样的数据结构比较合理呢?显然用map或者是切片都可以,但是用map呢,相对来说。比较容易一点,所以说呢,待会儿呢,我会建一个这样的东西,大家听我说大概呢,我会建一个online。
03:04
注意听啊。On,这个user。那现在呢,这个us里面,我们认为它是长什么样子,他琢磨这事,他琢磨这事,这里面就要考虑一个问题了,肯定这个map呢,它应该它的K应该是个int。这个int我们就。表示什么呢?表示这个用户的ID号是不是。那第二个最为关键的问题是,最为关键的问题是,就是说你维护这个在线列表的目的是什么?你的目的是什么?你的目的肯定是想希望通过这个在线列表想一个办法,能够让这个服务器跟各个在线用户列表进行一个通讯。是这意思吧?你要通讯你怎么做?因为你的目的不是要维护他的一个ID和这个用户本身的信息,你不是要维护这个,你主要是要维护让将来我们这个服务器可以跟各个客户端通讯,也就是说将来你这里面要有一个最重要的功能,比如说我这里有一个客户端来了,注意听啊,这边今天这个呢讲的内容啊,看起来功能说起来很简单,但实际上特别烧脑。
04:25
知道什么叫骚扰吗?骚扰的意思就是说你突然感觉到你的CPU内核不够用了,因为你写代码,你会突然你你原先是单机版的。现在你变成多核了。当老师一点,我说哎,这样一写你马上,哎天生写很挺还挺对的,但是我不说你就很难想到那去明白我是吧,所以这个点是骚扰,但是很有意思,写完了过后,你会突然感觉到这个结果是未知的,就是你感觉突然一下整出来,你会感觉到很爽。但是你一旦整不出来呢,你会调好久都出不来啊,所以这个地方今天今天这个课程呢,是比较烧脑的一节课,但是很有意思的一节课啊,那你这里面的你要分析出来呀,哦,原来以后这个家伙他主要的任务他去维护很多客户端呢,比如说我们这有一个A客户端。
05:18
注意听啊,我把这个思路分清清楚,A客户端,那么这将来呢,会有一个B客户端,我不管我不管B客户端OK,那你A客户端和B客户端他们之间呢,会有一个关联的关系,跟服务器我就我就画到这里啊,我不画那么多了,因为画多了这个地方本身它就很很乱。你在画多了这个线,线呢,整的跟一个蜘蛛网似的。好,现在当然还有很多,那大家想想,你最重要的就是要维护服务器跟客户端的这个重要的连接,如果你把这个连接忘掉了,那我告诉你,你啥事都干不了。
06:00
你什么事都干不了。你光光有他的信息有什么用呢?数据库有信息,你还维护这个干啥?最主要说你要想办法维护,你这个服务器要跟各个连接,关键就是跟连接要要抓住,因为你只有这个连接了,过后呢,你就可以做任何事情,你既可以群发,也可以点对点私聊,你甚至可以指定发一个图片,发一个视频,发一个声音都可以了。所以说这里面呢,最关键就是说这个地方,它的map里面这个值用什么比较合理。显然,同学们要动脑筋了。那么用什么来比较合理呢?寻寻觅觅,我们发现这里面一定要维护连接,而这个连接在哪里有呢?我们用一动脑筋,我发现,哦,原来user process是有的。User process,那么这个时候呢,你就打开你的这个Vs code,你看一下当时我们这个user process是一个什么样的玩意儿,它其实就是一个结构体,OK,那这个时候呢,我们思路就。
07:04
有点柳暗花明又一春的感觉啊,当然这个只是第一步思路啊,同学们好,我们来看一看我们当时的这一个user process是什么,我先把节奏关闭掉。好,打开我们的这一个。我们前面讲的这个内容是在chart room这个地方,OK,好,不着急同学们找到chart room,我们在server这一端,Server这一端我们有一个process,这一层里面有个user process,而这个us process里边呢,大家可以清楚的发现,它本身就维护了一个可爱的connect。那么只差一个了,你这个时候呢,这个user process有了这个字段过后呢,哎,那我就想办法了,如果说我在这一头在维护它的一个指针就好了,它本身是一个结构体嘛,那我这样做啊,我就维护一个C星号。
08:06
有点。有点process。那将来我这个map里面长的是什么样子呢?注意听啊,这个地方这个是个关键点,那也就是说将来我的map是这样的一个结构。他有用户ID,注意听啊,我画一个简单示意图,我就画两个,不然的话你听不懂啊,你你即使听懂你要花很长时间,比如说有一个客户是100号,100号这个人,这个100号这个人呢,它对应的一个K。它对应的key。它对应的一个K,这个K值是什么呢?各位朋友,这个K值呢,就是我们的一个user process的一个指针,说白了。就是你的这个userr。说白了,就是一个user process。User process。好,这个process呢,是第几号呢,是100号的,那当然将来还有可能是有200号的。
09:04
诶,他将来呢,还有200号的。对,200号的呢,他也会护起来,当然还有还有300号的,400号的啊,很多很多,这个呢,我就不去一个一个的去做这个,呃,做做做做这个做测试了,200号的好,当然还有300号的,那也就是说你这里面呢,最关键的就是说你怎么去维护这个在线列表,增删改查全部都要有,因为一旦有了这个这个online user这个map过后呢,你要干的事情就很轻松了,你的思路就这样子了啊同学们看,当我维护了这样一个东西过后,同学们想一想,我的这个完成这个功能的思路就基本上就展现在大家面前了,就是当用户登录后,可以得到当前在线用户列表,我的思路是这样子的。同学们看。注意听啊,第一步,第一步在哪里呢?在服务器端,服务器端维护,维护一个一个这个东西啊,那。
10:06
User map online users。这个online map呢,它这里面维护的信息就是一个map。对,这个map。那么维护这个map的价值在什么地方呢?维护这个map的价值是因为我在维护这个map的时候,这个user user process里面它有一个特别重要的一个一个字段,就是那个连接,就是它这里面最重要的就是我们是希望它维护自己的一个连接,但这个连接的是独立的啊,就是说各个各个这个客户端的连接它是不一样的,所以说这个是我们的一个核心点。好。那这是第一个就有它维护它,那么这个时候呢,我就会去创建一个,注意听啊,我会创建一个新的这个结构体啊,我们创建一个新的文件吧,新的文件这个文件呢,我就把它叫做user。
11:06
User manager。点构这个文件里面维护了它的一个结构体,它要完成什么呢?注意听听啊,该文件的作用是该文件。该文件啊,该文件功能完成的功能,完成功能是什么呢?就是对。对这个user map就是实际上就是对他的一个增删改查。因为有可能要离线,离线你还把它干掉,对他这个的这个map的。这个map。这个map的增删改查。好,第一步,这个思路有了第二步,第二步你光有这个增删改查没有用,你得你得找准这个时机,什么时候增加,什么时候删除,什么时候改好,这是第一个,第二个同学们还有一个问题。因为你你现在返回的这个同学们也知道,目前我们返回的这个,呃,就是当一个用户登录以后,当一个用户登录以后,我们返回的这个结果是什么结果,大家可以看到。
12:12
目前当一个用户登录以后呢,我们返回的这个截message,它的字段是这个样子的。4LOGGING。A response message。那这个时候呢,只有一个code,只有个error,没有用。那么这个时候呢,我们希望在这个返回的就是登录的时候,我返回的这个结构集里边呢,啊,就是这个字段里面,我还增加一个东西,就是你当前在线用户的ID的一个切片。就是你有多少个,我给你编辑起来,我我返回给你,然后呢,你解析它,你就可以看到了,是这意思吧,所以你在登录那瞬间呢,我们还要增加一个这个东西,就是第二步要在这增加一个东西,好也就是就是我的一个思路,比比如说我在这里要加这么一个user切片。
13:06
那第二个动作我要做的是要修改改进啊,要改进什么呢。在这改进往这边挪一挪啊,就是在哪里呢。在这个,呃,Logging。Logging,注意听logging response message这个结构体中增加。增加一个字段,这个字段呢,是叫users or in。啊,这个切片,这个切片呢,是会把在线用户的ID返回去,将。将在线用户的ID、用户ID返回。好,那就是他一登录的时候,我把这个点返回。好,那么有了这两个思路以后呢,我们就可以来动手写一写了,就说这是最基本的一个分析啊,这个思路大致思路是这样子的,那么现在呢,我们就可以来动手简单写一写了,那在具体的情况呢,再根据需求再做开发,就发一个请求过来,然后呢,我帮你去从这个地方找东西,找到过我再给你打回去,你再显示,就说这里面还要增加一个功能,当。
14:21
当用户登录后,当用户登录后。登陆后。登录后可以可以显示显示当前在线在线用户列表。列表。当然我这样做呢,大家也可以看到还有缺陷,缺陷是什么呢?你只有在登录内瞬间拿到。那如果说你登录完了过后有新的用户登录。你怎么知道新的用户上线了呢?那还要加新的功能。那后台那个,我们原先起的那个后台,偷偷在跟服务器交互的那个,携程就会发挥重要的作用,我们先把第一步做完啊,好,思路已经有了,我们来完成它。
15:06
好,同学们,先把第一个功能完成。我先把这个进行一个板书。好,思路我已经分析完了,我先把我的一个板书出来往下走,在这现在我们要完成的任务是这样子的啊,同学们,实现完成登录时返回当前在线的用户列表。给他一个标题三。标题三这个功能呢,我们我们分两步走,第一步,第一步就是这个事物。好的,第一步是这个思路啊。好。我给他来一个标题,然后呢,首先我做了一个思路的分析。我做了一个思路的分析。好思路分析。思路分析OK,好,关键是代码实现对不对?
16:01
思路分析呢,是我刚才这样子画的这样子大体大家应该能看的出来。哎,这是我的一个思路分析重点就是要加一个user,呃,这个manager顶购,那么这个呢,我们就把它放在这个,呃,处理层,处理层就是我们的这个控制层,好,我把它放在我的笔记中去,放在我的笔记中去。好,思路分析呢就到这里,我们思路分析就先给大家分析到这里。
我来说两句