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

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

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

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


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

 

内容简介:

一、代码实现

二、代码说明

 

 

一、代码实现

上一节已经将思路都分析了一遍,现在来进行代码实现:首先在server/process中新建一个文件 userMgr.go ,再输入以下代码:

package process2

import (

“fmt”

)

//因为 UserMgr.go 实例在服务器端有且只有一个

//因为在很多的地方,都会使用到,因此,我们

//将其定义为全局变量

var (

userMgr *UserMgr  // userMgr 类型是 UserMgr ,是一个指针类型

)

type UserMgr struct {   //申明结构体

onlineUsers map[int]*UserProcess  //map 的 k 值是 int,是指向 UserProcess 的指针

}

//完成对 userMgr 初始化工作

func init() {

userMgr = &UserMgr{

onlineUsers:make(map[int]*UserProcess, 1024),

}

}

//完成对 onlineUsers 添加(添加也是修改)

func (this *UserMgr) AddOnlineUser(up *UserProcess) {

this.onlineUsers[up.UserId] = up

}

说明:要维护的实际上是 UserProcess 的一个指针,所以在添加时只需直接传一个 UserProcess ,因为在 UserProcess.go 文件内有连接,为了好管理应该再加一个字段,不然会很麻烦,所以在server/process/UserProcess.go文件中添加为以下代码:

type UserProcess struct {

//字段

Conn net.Conn

//增加一个字段,表示该 Conn 是哪个用户

UserId int

}

所以在上文代码中添加了 up *UserProcess 指针。

//删除

func (this *UserMgr) DelOnlineUser(userId int) {

delete(this.onlineUsers, userId)

}

说明:假如有个用户离线了,他有可能是注销或退出了,也有可能删除此功能,那么应当如何删除?从 map 里删除,有一个专门的类指函数称为 delete ,所以只需把 this.onlineUsers, userId 传入进去即可。

//返回当前所有在线用户

func (this *UserMgr) GetAllOnlineUser() map[int]*UserProcess {

return this.onlineUsers

}

说明:查询中最关键的一个任务是就是当一个用户登录以后要去返回当前在线用户的哪些,所以它必须要有一个 GetAllOnlineUser 这样的方法,因为要把所有的在线用户都返回,所以还需返回当前在线用户的方法。

//根据 id 返回对应的值

func (this *UserMgr) GetOnlineUserById(userId int) (up *UserProcess, err error) {

//如何从 map 取出一个值,带检测方式

up,ok := this.onlineUsers[userId]

if !ok { //说明,你要查找的这个用户,当前不在线。

err = fmt.Errorf(“用户%d 不存在”,userId)

return

}

return

}

说明:别人传了一个 ID 给你,你给他返回对应的 map 值,即需点对点的聊天,比如将来 A 客户想给 B 客户说话,那 A 客户端肯定说它要给 B 客户端说,于是服务器会从 map 里面拿出 B 客户端对应的 userProcess ,然后给它传东西过去,所以应该再提供一个根据ID 返回对应的 UserProcess 的功能。

//本应该再加一个修改的功能,但是修改的本质就是 Add ,且  map中的 k 是唯一的,如果传进去一个相同的 k ,它相当于去替换了原有的值。

将以上代码保存即可。

 

二、代码说明

(1)要维护的实际上是 UserProcess 的一个指针,所以在添加时只需直接传一个 UserProcess ,因为在 UserProcess.go 文件内有连接,为了好管理应该再加一个字段,不然会很麻烦,所以在server/process/UserProcess.go文件中添加为以下代码:

type UserProcess struct {

//字段

Conn net.Conn

//增加一个字段,表示该 Conn 是哪个用户

UserId int

}

所以在上文代码中添加了 up *UserProcess 指针。

(2)假如有个用户离线了,他有可能是注销或退出了,也有可能删除此功能,那么应当如何删除?从 map 里删除,有一个专门的类指函数称为 delete ,所以只需把 this.onlineUsers, userId 传入进去即可。

(3)查询中最关键的一个任务是就是当一个用户登录以后要去返回当前在线用户的哪些,所以它必须要有一个 GetAllOnlineUser 这样的方法,因为要把所有的在线用户都返回,所以还需返回当前在线用户的方法。

(4)别人传了一个 ID 给你,你给他返回对应的 map 值,即需点对点的聊天,比如将来 A 客户想给 B 客户说话,那 A 客户端肯定说它要给 B 客户端说,于是服务器会从 map 里面拿出 B 客户端对应的 userProcess ,然后给它传东西过去,所以应该再提供一个根据ID 返回对应的 UserProcess 的功能。

(5)本应该再加一个修改的功能,但是修改的本质就是 Add ,且  map中的 k 是唯一的,如果传进去一个相同的 k ,它相当于去替换了原有的值。

相关文章
|
7月前
|
存储 监控 数据挖掘
消防行业如何借助时序数据库 TDengine 打造高效的数据监控与分析系统
本篇文章来自“2024,我想和 TDengine 谈谈”征文活动的优秀投稿,深入探讨了如何在消防行业中运用 TDengine 进行业务建模。文章重点介绍了如何通过 TDengine 的超级表、标签设计和高效查询功能,有效管理消防监控系统中的时序数据。作者详细阐述了实时监控、报警系统以及历史数据分析在消防行业中的应用,展示了 TDengine 在数据压缩、保留策略和分布式架构下的强大优势。
198 0
|
12月前
|
消息中间件 网络协议 C#
C#使用Socket实现分布式事件总线,不依赖第三方MQ
`CodeWF.EventBus.Socket` 是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。
C#使用Socket实现分布式事件总线,不依赖第三方MQ
|
10月前
Highcharts 柱形图
Highcharts 柱形图
78 7
|
12月前
|
Prometheus 监控 Kubernetes
监控对象都有哪些分类
【10月更文挑战第9天】本文介绍了多种监控类型及其特点,包括业务监控、应用监控、组件监控、资源监控、设备监控及网络监控。
|
监控 jenkins 持续交付
Unity精华☀️点乘、叉乘终极教程:用《小小梦魇》讲解这个面试题~
Unity精华☀️点乘、叉乘终极教程:用《小小梦魇》讲解这个面试题~
|
存储
指针和数组简单填空题合集(纯刷题:60道)
指针和数组简单填空题合集(纯刷题:60道)
220 0
|
数据采集 人工智能 搜索推荐
OpenAI公布「官方爬虫」:GPT-5靠它训练,有需要可以屏蔽
OpenAI公布「官方爬虫」:GPT-5靠它训练,有需要可以屏蔽
683 1
|
存储 数据库
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(八)
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(八)
|
缓存 Kubernetes 数据库
大厂面试必问:如何设计一个扛高并发的系统?
高并发系统是指:在短时间内同时有大量用户请求访问系统,需要系统能够快速、稳定地响应这些请求。本文将讲述如何设计一个扛高并发的系统。