chatserver
可以工作在nginx tcp负载均衡环境中的集群聊天服务器和客户端源码(基于muduo库实现)
技术栈
- c++11
- muduo网络库
- 基于发布-订阅的redis消息队列
项目需求
项目目标
项目结构介绍
遇到的问题
- 客户端注销登录问题
- 描述:用户登录后,注销账号在进行登录,主线程可能发生阻塞(问题代码:
src/client/client.cpp
) - 分析定位:原代码在登录后启动子线程,作为接收线程,但是登录响应处理逻辑是由主线程负责的,当用户注销后,子线程没有结束,用户再次进行登录时,主线程和子线程竞争clientfd资源,子线程占到资源,但是没有提供登录响应处理逻辑
- 解决:
- 在客户端和服务端连接成功后就创建子线程,作为接收线程,专门处理服务器端的响应(也包括登录响应、注册响应);
- 加入信号量机制,在登录和注册时,子线程处理完成后,通过信号量,通知阻塞在信号量的主线程继续执行;
- 考虑到登录成功和失败的时候,显示界面不同(主线程执行不同的代码),并且登录响应业务逻辑由子线程负责,所以添加一个原子类型的全局变量,在多线程环境下(主线程,接收线程)保证线程安全的同时,作为是否登录成功的判断依据。
- 描述:用户登录后,注销账号在进行登录,主线程可能发生阻塞(问题代码:
TodoLists
- 好友列表显示问题
- 好友/群组成员上限通知
- 添加好友时,发送通知
项目运行
开发环境配置
- muduo网络库编译安装
- nginx tcp负载均衡配置
- redis环境安装
编译方式
cd build
rm -rf *
cmake ..
make