海量用户通讯系统-显示在线用户列表(1)|学习笔记

简介: 快速学习海量用户通讯系统-显示在线用户列表(1)

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:海量用户通讯系统-显示在线用户列表(1)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/626/detail/9813


海量用户通讯系统-显示在线用户列表(1)

 

内容简介:

一、海量用户即时通讯系统

二、思路分析

 

一、海量用户即时通讯系统

继续讲解海量用户即时通讯系统,前面已经完成了一个到服务器注册的功能,现在完成登录时能返回当前在线用户,甚至可以做更好一些,即可以返回当前在线用户列表的各种状态,因为一个用户的状态有很多种,他可能是发呆、吃饭、忙碌或在线等等。首先看思路,再把功能分成两步,现在要做的功能是完成登录时能返回当前在线用户,第一个功能是用户登录后,可以得到当前在线用户列表,现在讲解思路分析、示意图、代码实现。这里的问题就是当一个用户登录以后,通过此客户端登录到服务器,那么登录到服务器以后应当如何处理?

 

二、思路分析

1. UserMgr.go 需完成的功能

首先在服务器这应该有一个专门来维护当前在线用户的一个结构体,姑且称之为 UserMgr.go ,它要完成这些功能:

(1)维护在线列表。若要维护一个用户在线列表具体来说应该有个数据结构,那么用怎样的数据结构比较合理?显然用 map 或者切片都可以,但是使用 map 相对较容易一点,所以过一会会建一个 onlineUsers ,在 Users 里是长什么样的,这里面就考虑且肯定这个 map 的 k 是 int ,此 int 表示用户的 ID 号。

(2)维护在线列表的目的是什么?目的是想希望通过在线用户列表想一个办法能够让服务器跟各个用户在线列表进行通讯,那么通讯应该怎么做?由于目的不是维护让它的 ID 和用户本身的信息,反而主要是维护让将来这个服务器可以跟各个客户端通讯,即将来这里面要有一个最重要的功能。

2. 烧脑的含义

今天讲解的内容虽看起来功能简单,但实际上很烧脑,烧脑的意思是你会突然感觉到你的 CPU 内核不够用了,因为原先写代码是单机版的,现在突然变成多核,当老师一指点,你再一写,写的还挺对,但如果不指点就很难想出来,写完过后会突然觉得结果是未知的,且如果突然一下子整出来感觉会很爽,但是一旦整不出来即使绕好久都出不来,这便是烧脑。所以这节课是比较烧脑的课程,也是很有意思的课程。

3. 连接的重要性

且里面的要分析出来,以后它主要的任务就是维护很多客户端,比如有 A 客户端,有 B 客户端,那 A 客户端和 B 客户端它们之间会有一个关联的关系跟服务器,最重要的就是维护服务器和客户端这个重要的连接,如果把连接忘掉了,那便什么事都干不成,光有信息是没有用的,数据库有信息没必要维护,所以需要想办法维护此服务器跟各个连接,关键把连接抓住,因为只有连接了过后才可以做任何事情,既可以群发,也可以点对点私聊,甚至可以指定发一个图片、一个视频、一个声音都可以,所以这里最关键的就是它的 map 里面的值用什么合理,寻寻觅觅发现里面一定维护连接,而这个连接在哪里有?在 UsersProcess.go 是有的,此时打开 VSCode 看一下当时的UsersProcess.go 是什么样的,它其实就是结构体,那么思路就柳暗花明又一村了。

4. 维护用户在线列表

再来看当时的 UsersProcess 暂时是什么,打开之前讲的内容,找到chartroom 内的 server 里面有一个 process ,其内有一个UsersProcess.go ,而此 UsersProcess.go 里面清楚的发现它本身就维护了一个 Conn net ,那此时 UsersProcess.go 有了这个字段后,就只需想办法再维护它的一个指针,因为它本身就是个结构体,做完一个就维护一个 onlineUsersmap[int]*UsersProcess ,那么将来 map 里面是什么样?将来的 map 它有用户 ID ,比如有个客户是100号,这个100号对应的 k 值是 Users Process 的一个指针,总的来说就是一个 Users Process ,这个 UsersProcess 是100号的,将来还可能会有200号、300号、400号等等,这个就不一一做测试了。这里最关键的就是如何去维护用户在线列表,因为一旦有了onlineUsersmap 过后就很轻松了。

5. 思路分析步骤

当维护了这样的东西过后完成此功能的基本思路就展现在各位面前了,当用户登录后,可以得到当前用户在线列表,思路是:

(1)在服务器端维护一个 onlineUsersmap[int]*UsersProcess ,此onlineUsersmap 它维护的信息是 map ,那么维护 map 的价值是什么?在维护 map 的时候 UsersProcess 有个特殊的重要字段,就是连接,这里最重要的就是希望它维护自己的连接,但这个连接并不是独立的,各个客户端的连接是不一样的,这便是我们的核心。

(2)创建一个新的文件称之为 usersMgr.go ,文件里面维护了UsersMgr.go 的结构体,该文件完成功能就是对 onlineUsers 这个map  的增删改查,光有增删改查也没有用,需要找到时机,即何时删何时增。当一个用户登录以后返回的结果是什么,可以看到目前登录以后返回的结果,点开 message.go 它里面的字段是 LoginResMes ,此时只有 Code 和 Error 没有用,这个时候希望登录时返回的字段里面增加一个东西,即当前在线用户的 ID 的切片,就是有多少个再编辑起来返回,解析它就可以看到了,所以在登录的那一瞬间还要增加一个东西。

(3)在 LoginResMes 中增加一个字段 Users[]int //将在线用户的 ID 返回,即他一登录时就返回。那么有了思路之后就可以动手写一写了,具体的情况再根据需求进行开发,发一个请求过来,然后帮你去从 onlineUsersmap[int]*UsersProcess 找东西,找到后再给你打回去,再显示,即这里面还要增加一个功能。

(4)当用户登录后可以显示当前在线用户列表,即使这样做还是有缺陷,缺陷就是只有在登录的那一瞬间拿到,那如果登录完了过后有新的用户登录,无法知道新的用户上线了,那么还需要加一个新的功能,原先起的后台偷偷在跟服务器交互的协程就会发挥重要的作用。

6. 示意图

image.png

相关文章
|
网络协议 前端开发 测试技术
海量用户通讯系统——服务端结构改进1|学习笔记
快速学习海量用户通讯系统——服务端结构改进1
海量用户通讯系统——服务端结构改进1|学习笔记
|
前端开发 Java 应用服务中间件
基于websocket的实时通告功能,推送在线用户,新登录用户
SpringBoot 部署与Spring部署都有一些差别,但现在用Srpingboot的公司多,SpringBoot创建项目快,所以使用该方式来讲解,有一个问题就是开发WebSocket时发现无法通过@Autowired注入bean,一直为空。
基于websocket的实时通告功能,推送在线用户,新登录用户
|
NoSQL 网络协议 关系型数据库
海量用户通讯系统-完成界面|学习笔记
快速学习海量用户通讯系统-完成界面
海量用户通讯系统-完成界面|学习笔记
|
JSON 网络协议 测试技术
海量用户通讯系统-项目小结|学习笔记
快速学习海量用户通讯系统-项目小结
海量用户通讯系统-项目小结|学习笔记
|
缓存 JSON 网络协议
海量用户系统-客户端结构改进2|学习笔记
快速学习海量用户系统-客户端结构改进2
海量用户系统-客户端结构改进2|学习笔记
|
网络协议 测试技术 Go
海量用户通讯系统——客户端结构改进1|学习笔记
快速学习海量用户通讯系统——客户端结构改进1
海量用户通讯系统——客户端结构改进1|学习笔记
|
机器学习/深度学习 JSON 网络协议
海量用户通讯系统-显示在线用户列表(7)|学习笔记
快速学习海量用户通讯系统-显示在线用户列表(7)
|
JSON 网络协议 测试技术
海量用户通讯系统-显示在线用户列表(6)|学习笔记
快速学习海量用户通讯系统-显示在线用户列表(6)
|
机器学习/深度学习 JSON 前端开发
海量用户通讯系统-显示在线用户列表(4)|学习笔记
快速学习海量用户通讯系统-显示在线用户列表(4)
|
网络协议 测试技术 Go
海量用户通讯系统-显示在线用户列表(5)|学习笔记
快速学习海量用户通讯系统-显示在线用户列表(5)
下一篇
无影云桌面