经典项目-海量用户即时通讯系统
- 用户注册
- 用户登录
- 显示在线用户列表
- 群聊(广播)
- 点对点聊天
- 离线留言
要求:能够正确显示客户端菜单:client.go/login.go文件。
注意:当我们测试的时候显示undefined:login时,要切换到src目录下去go build chatroom/client才可以。
要求:先完成指定用户的验证,用户id=100,密码pwd=123456可以登录,其他用户不能登录
发送消息流程
- 先创建一个message结构体,mes.Type是登录消息类型,mes.Data登录消息的内容(序列化后的)
- 对mes进行序列化
- 在网络传输中,最麻烦丢包。先给服务器发送mes的长度(有多少字节),在发送消息本身
接受数据的流程
- 接受到客户端发送的长度len
- 根据接受到的长度len,在接受消息本身,然后判断实际接受的消息内容是否等于len
- 如果不相等,就有纠错协议
- 取到后->反序列化->Message
- 取出message.Data反序列化->LoginMes
- 取出loginMes.userid和loginMes.userpwd就可以比较了,根据比较结果返回Mes发送给客户端
如输入的用户名密码在 Redis 中存在则登录,否则退出系统,并给出相应的 提示信息:
- 用户不存在,你也可以重新注册,再登录
- 你密码不正确。。
要求:完成注册功能,将用户信息录入到Redis中
思路:
要求:用户登录后,可以得到当前在线用户列表
- 在服务器端维护一个onlineUsers map[int] *UserProcess
- 创建一个新的文件userMgr.go,完成功能对onlineUsers这个map的增删改查
- 在LoginResMes增加一个字段Users []int,将在线用户id返回
- 当用户登录后,可以显示当前在线用户列表
问题:当一个新的用户上线后,其他已经登录的用户不能获取到最新在线用户列表!!
思路3
- 当一个用户A上线后,服务器就把A用户的上线信息推送给所有在线的用户;
- 这时客户端也需要维护一个map[int]User,map中记录了他的好友(目前就是所有);
- 客户端和服务器的通讯要依赖serverProcessMes协程。
思路:
- 新增一个消息结构体SmMes
- 新增一个model CurUser
- 在smsProcess.go增加相应的方法SendGroupMes,发送一个群聊的消息
- 实现私聊
- 如果一个用户离线,就把这个人从在线列表去掉
- 实现离线留言,在群聊时候,如果某个用户没有在线,当登录后,可以接收离线的消息
- 发送一个文件