假设有2个用户,用户1要把他的id和要发送的内容给用户2,用户1需要先把自己的id和所要发送的内容都发送给服务器了,服务器再主动地去给用户2去推送这条消息,但是用户2不知道什么时候被推送消息,不可能去服务器上拉消息,所以这个消息肯定是服务器退给用户2。所以聊天服务器必须是长连接服务器,因为不仅仅是客户端请求,还有服务器主动推送消息到客户端。 所以我们拿到用户2的id号,需要获取这个用户和服务器的连接connection,我们在业务层要想办法,一个用户一个connection,登录成功,连接就建立成功了,这个连接就可以存储下来。
网络模块中的onMessage方法就是在不同的工作线程中被回调的,当多个用户同时登录时会有多个线程同时写userConnMap,然后C++ STL中的容器没有考虑过线程安全,我们需要对userConnMap进行线程互斥
1. 添加互斥锁connMutex和存储连接的哈希表userConnMap
在include/server/chatservice.hpp的添加
2. 在登录成功的代码段添加线程安全的记录连接代码
在src/server/chatservice.cpp添加
编译