本节来实现C++集群聊天服务器项目中的服务器异常退出与添加好友业务,一起来试试吧
一、服务器异常退出
在Linux环境下,我们在服务器端使用CTRL+C结束程序执行,即使用CTRL+C让服务器异常退出,这样的后果是本应登录服务器的用户在数据库中在线状态未及时修改为离线,在下次重新登录时会显示用户已登录。
为解决上述问题,编写服务器异常退出函数,只要调用用户操作对象_userModel将所有在线用户状态修改为离线即可
1.1 服务器异常退出代码
代码实现比较简单,在chatservice.hpp中声明函数,在chatservice.cpp中定义
// 服务端异常,业务重置方法
void reset();
// 服务端异常,业务重置方法
void ChatService::reset()
{
// 把所有online用户的状态设置为offline
_userModel.resetState();
}
在main函数,调用业务模块处理服务器异常退出的函数,signal信号捕获突发事件
#include "chatserver.hpp"
#include "chatservice.hpp"
#include <signal.h>
//处理服务器ctrl+c结束程序后,重置用户user的状态信息
void resetHandler(int){
ChatService::instance()->reset();
exit(0);
}
int main()
{
signal(SIGINT,resetHandler);
EventLoop loop;
InetAddress addr("127.0.0.1", 6000);
ChatServer server(&loop, addr, "ChatServer");
server.start();
loop.loop();
return 0;
}
1.2 功能实现
使用张三的账号登录服务器
张三已经在线
服务器ctrl+c异常退出
数据库张三状态已修改为离线。
服务器异常退出业务验证成功!
二、添加好友
服务器要实现好友聊天,那么就需要添加好友,才可依据好友id号与您的好友进行通信,本节来实现添加好友操作
2.1 添加好友步骤
(1)从json对象中获取用户userid和欲添加的好友friendid
(2)定义FriendModel类对象操作好友表,编写添加好友与查询好友列表两个函数
// 添加好友关系
bool insert(int userid, int friendid);
// 返回用户好友列表
vector<User> query(int userid);
使用FriendModel类对象向数据库好友表中插入好友关系
(3)添加好友成功,返回响应信息、userid和friendid;添加失败,传回响应信息即可
// 添加好友业务 {"msgid":6,"id":22,"name":"Jiao","friendid":13}
void ChatService::addFriend(const TcpConnectionPtr &conn, json &js, Timestamp time)
{
int userid = js["id"].get<int>(); //获取用户id
int friendid = js["friendid"].get<int>(); //获取好友id
// 存储消息
bool state = _friendModel.insert(userid, friendid);
if(state){
//添加好友成功!
json response;
response["msgid"] = ADD_FRIENG_MSG_ACK;
response["error"] = 0;
response["errmsg"]="成功添加好友!";
response["id"] = userid;
response["friendid"] = friendid;
conn->send(response.dump());
}else{
//添加好友失败
json response;
response["msgid"] = ADD_FRIENG_MSG_ACK;
response["error"] = 1;
response["errmsg"]="添加好友失败!";
conn->send(response.dump());
}
}
(4)在登录业务中,返回用户离线消息后,也返回用户的好友表,用户可以选择与指定好友进行聊天啦
// 查询该用户的好友信息并返回
vector<User> userVec = _friendModel.query(id);
if (!userVec.empty())
{
vector<string> vec2;