开发者学堂课程【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 ,它相当于去替换了原有的值。