/chatroom

海量用户即时通讯系统,实现用户登录、注册、显示在线用户列表、群聊等功能

Primary LanguageGo

chatroom

经典项目-海量用户即时通讯系统

需求分析

  1. 用户注册
  2. 用户登录
  3. 显示在线用户列表
  4. 群聊(广播)
  5. 点对点聊天
  6. 离线留言

功能开发

显示客户端登录菜单

要求:能够正确显示客户端菜单: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 中存在则登录,否则退出系统,并给出相应的 提示信息:

  1. 用户不存在,你也可以重新注册,再登录
  2. 你密码不正确。。

用户注册

要求:完成注册功能,将用户信息录入到Redis中

思路:

登录时返回当前在线用户

要求:用户登录后,可以得到当前在线用户列表

实现思路

  1. 在服务器端维护一个onlineUsers map[int] *UserProcess
  2. 创建一个新的文件userMgr.go,完成功能对onlineUsers这个map的增删改查
  3. 在LoginResMes增加一个字段Users []int,将在线用户id返回
  4. 当用户登录后,可以显示当前在线用户列表

问题:当一个新的用户上线后,其他已经登录的用户不能获取到最新在线用户列表!!

思路3

  1. 当一个用户A上线后,服务器就把A用户的上线信息推送给所有在线的用户;
  2. 这时客户端也需要维护一个map[int]User,map中记录了他的好友(目前就是所有);
  3. 客户端和服务器的通讯要依赖serverProcessMes协程。

完成登录可以群聊

当一个用户上线后,可以将群聊消息发给服务器,服务器可以接收到

思路:

  1. 新增一个消息结构体SmMes
  2. 新增一个model CurUser
  3. 在smsProcess.go增加相应的方法SendGroupMes,发送一个群聊的消息

扩展功能

  1. 实现私聊
  2. 如果一个用户离线,就把这个人从在线列表去掉
  3. 实现离线留言,在群聊时候,如果某个用户没有在线,当登录后,可以接收离线的消息
  4. 发送一个文件