开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:海量用户通讯系统-显示在线用户列表(4)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9816
海量用户通讯系统-显示在线用户列表(4)
内容简介
一、对上一节的小结
二、代码整理
一、对上一节的小结
上一节把实现功能-完成登录时能返回当前在线用户讲述完了,现在只剩一点尾巴。目前有一个问题,即比如某个人登录成功过后他看到在线登录用户列表中按理自己是不用显示的,但是 QQ 也是将自己在线显示出来,那就不成问题了。但如果希望能不显示自己在线信息,代码应该编写如下:
//fmt.Println(“登录成功”)
//可以显示当前在线用户列表,遍历loginResMes.UserId
fmt.Println(“当前在线用户列表如下:”)
for _, v == userId {
//如果我们要求不显示自己在线,下面我们增加一个代码
if v == userId {
continue
}
fmt.Println(“用户id:\t”,V)
}
fmt.Println(“\n\n”)
二、代码整理
1. 在 server/process/userMgr.go 中编写的代码
package process2
import (
“fmt”
)
//因为 UserMgr 实例在服务器有且只有一个
//因为在很多的地方,都会使用到,因此,我们
//将其定义为全局变量
var (
userMgr *UserMgr
)
type UserMgr struct {
onlineUsers map[int]*UserProcess
}
//
func init() {
userMgr = &UserMgr{
onlineUsers : make(map[int]*UserProcess, 1024),
}
}
//完成对 userMgr 初始化工作
func (this *UserMgr) AddOnlineUser(up *UserProcess) {
this.onlineUsers[up.UserId] = up
}
//删除
func (this *UserMgr) DelOnlineUser(userId int) {
delete(this.onlineUsers, userId)
}
//返回当前所有在线用户
func (this *UserMgr) GetAllOnlineUser() map[int]*UserProcess{
return this.onlineUsers
}
//根据 id 返回对应的值
func (this *UserMgr) GetOnlineUserById(userId int)(up *UserProcess, err error) {
//如何从 map 取出一个值,带检测方式
up, ok := this.onlineUsers[userId]
if lok { //说明,你要查找的这个用户,当前不在线。
err = fmt.Errorf(“用户%d 不存在”, userId)
return
}
return
}
2. 在 server/process/userProcess.go 中编写的代码
在1.做完了后又在服务器端做了哪些工作?这块就增加了一点逻辑,所以可以发现以后写代码时且代码比较复杂的情况下,可能这个代码是这里写了一部分,然后又找到合适的位置再加进去逻辑,这个难度肯定比以前单机版的要难一些,因为网络就是这样,可以看到写网络程序的比如网络游戏的,一般其工资尤其是底层的写数据通道里程的工资一般会比写界面的工资高,现在普遍情况就是做后台的尤其是做数据通道的薪水一般会比较高是因为此领域涉及的东西很多,这里面的东西就多了比如算法、优化、压缩、安全等,全都是底层,所以这就是为什么界面的工资即使很高也不会比做后台的高,再厉害的前端也和在后台做架构、数据通道安全的不是一个级别,这不是说前端不好,前端也是很好的,但是和做后台的是有区别的,因为前端领域将来是可以有现成的模块化的东西,一拖拽就出来了,就比如现在的微信小程序基本对前端的要求少一点,但是还需要有很多去写,因为前端之所以现在工作还可以,是因为前端和后台不一样,前端它都可以做,而后台不一样,后台比如搞 C 语言、 Go 、 Java 它们的后台都是不一样的,前面大统一的都是前端,它不分,比如你后台是用Java 写的,前端也是这个,需求量还是比较大的,很难做到一个精。在 server/process/userProcess.go
中编写的代码如下:
} else {
loginResMes.Code = 200
//这里,因为用户登录成功,我们就把该登录成功的用放入到userMgr 中
//将登录成功的用户的 userId 赋给 this
this.UserId = loginMes.UserId
userMgr.AddOnlineUser(this)
//将当前在线用户的 id 放入到 loginResMes.UsersId
//遍历 userMgr.onlineUsers
for id,_ := range userMgr.onlineUsers {
loginResMes.UsersId = append(loginResMes.UsersId, id)
}
fmt.Println(user,”登录成功”)
}
3. 在 common/message/message.go 中编写的代码
type LoginResMes struct {
Code int `json:”code”`//返回状态码500表示该用户未注册UsersId []int //增加字段,保存用户 id 的切片
Error string `json:”error”` //返回错误信息
}
4. 在 client/process/userProcess.go 中编写的代码
if loginResMes.Code == 200 {
//fmt.Println(“登录成功”)
//可以显示当前在线用户列表,遍历 loginResMes.UsersId
fmt.Println(“”)
for _, v := range loginResMes.UsersId {
//如果我们要求不显示自己在线,下面我们增加一个代码
if v == userId {
continue
}
fmt.Println(“用户id:\t”, v)
}
fmt.Println(“\n\n”)