Go语言学习篇8
海量用户即时通信系统
需求分析
1)用户注册
2)用户登录
3)显示在线用户列表
4)群聊
5)点对点聊天
6)离线留言
界面设置
- 显示客户端登陆菜单(正确显示)
通讯流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lbwSW44T-1609160469245)(Go语言学习篇08.assets/
)]
实现功能-完成初始化界面
1)让客户端发送消息长度
2)让客户端发送消息本身
3)服务器接收消息,然后反序列化消息结构体
4)客户解析返回LoginResMes,显示对应界面
5)这里我们需要做函数封装
实现功能-完成程序结构化
1)服务器修改,同时客户端也得修改,难受
2)程序改进,结构化(提高可读性)
3)画出程序框架改进图
- 步骤
- 现将分析出来的文件创建好
- 放入相应的文件夹中
- 剥离,根据各个文件完成的任务不同进行分离
- 修改服务端
- 修改客户端
实现功能-完成用户登录
1)model包完善
2)创建User结构体(用于Redis数据交互)
3)创建Error常量(自定义业务逻辑错误类型)
4)全局并初始化Redis连接池
5)全局+工厂模式+初始化UserDao
6)登录校验完善
7)Redis取值User密码校验
实现功能-完成注册用户
1)完成注册功能,将用户录入Redis数据库中
2)客户端注册功能
3)客户端:用户输入—>调用Register—>连接服务器—>发送mes---->接收resMes
4)服务端注册功能
5)服务端:dao增加用户—>增加用户的方法—>协程中增加注册方法—>根据类别选定调用的方法
实现功能-完成显示在线用户
1)LoginResMes添加在线用户切片
2)UserProcess,添加UserId表示Conn
3)写map的增删改查
4)编写userMgr
5)用户登录成功添加userProcess
代码
思路
实现功能-通知用户上线功能
1)一个用户登录,服务器推送用户状态
2)客户端自己维护
实现功能-完成群聊
1)客户端端的Conn只在Login中存在,客户端并没有维护Conn【CurUser】
2)新增一个smsMes结构体,增加SendGroupMes[群聊]方法
实现功能-拓展功能
1、实现私聊
2、如果一个登陆用户离线,就把这个人从在线列表去掉
- 客户端强制退出 OK
- 客户端输入退出
3、实现离线留言
4、发一个文件
注意事项-坑1
代码
main包login.go
package main
import "fmt"
func (user *User)Login() (bool, string) {
// 是否登录通过
var flag = false
// 返回信息
var error string = "登录失败"
fmt.Println("账号:", user.username)
fmt.Println("密码:", user.password)
return flag, error
}
main包client.go
package main
import (
"fmt"
"os"
)
type User struct{
username string
password string
}
func main() {
// 接收用户的选择
var key int
// 是否继续显示菜单
var loop bool = true
for true {
fmt.Println("-----欢迎登录多人聊天系统-----")
fmt.Println("\t\t\t 1 登陆聊天室")
fmt.Println("\t\t\t 2 注册用户")
fmt.Println("\t\t\t 3 退出系统")
fmt.Print("\t\t\t请选择(1-3):")
fmt.Scanf("%d\n", &key)
switch key {
case 1:
fmt.Println("登录聊天室")
loop =false
case 2:
fmt.Println("注册用户")
loop = false
case 3:
fmt.Println("退出系统")
os.Exit(0)
default:
fmt.Println("您的输入有误,请重新输入!")
}
if !loop {
break
}
}
var user *User = new(User)
// 根据用户输入显示新的提示信息
if key == 1 {
// 说明用户要登录
fmt.Print("用户账户:")
fmt.Scanf("%v", &user.username)
fmt.Print("用户密码:")
fmt.Scanf("%v", &user.password)
// 登录函数
loginFlag, loginMsg := user.Login()
if loginFlag {
fmt.Println("登录成功,", loginMsg)
} else {
fmt.Println("登录失败,", loginMsg)
}
// 成功后跳转页面
} else if key == 2{
fmt.Println("进行用户注册的逻辑")
}
}
dos密令运行
D:\Work\Goland\Go\src\go_project\chatRoom\Client>dir
驱动器 D 中的卷是 Data
卷的序列号是 2C37-C14D
D:\Work\Goland\Go\src\go_project\chatRoom\Client 的目录
2020/12/21 15:41 <DIR> .
2020/12/21 15:41 <DIR> ..
2020/12/21 15:41 1,256 client.go
2020/12/21 15:37 264 login.go
2 个文件 1,520 字节
2 个目录 820,620,009,472 可用字节
D:\Work\Goland\Go\src\go_project\chatRoom\Client>go run client.go
# command-line-arguments
.\client.go:53:30: user.Login undefined (type *User has no field or method Login)
解决方法
D:\Work\Goland\Go\src>go build -o client.exe go_project\chatRoom\Client
D:\Work\Goland\Go\src>client.exe
注意事项-坑2
D:\Work\Goland\Go\src>client.exe
-----欢迎登录多人聊天系统-----
1 登陆聊天室
2 注册用户
3 退出系统
请选择(1-3):1
登录聊天室
用户账户:lsx
用户密码:账号: lsx
密码:
登录失败, 登录失败
或者使用 fmt.Scanln(&username)