海量用户通讯系统-显示在线用户列表(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 ,它相当于去替换了原有的值。

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