用户登录
在创建Json对象的数据后,客户端和服务端就可以依据这个类型的数据进行通信了。我们通过解析Json对象val中的cmd指令,也就是命令,来判断客户端是想要进行什么操作(用户注册?登录?聊天?),从而执行对应的函数操作。
if(cmd == "login"){
server_login(bev,val); //执行用户登录对应的函数
}
在用户注册的回调函数server_login
中首先需要连接user数据库,来判断当前用户是否已经注册过,否则不是随便什么人都能不用注册直接登录了?这里我们通过my_database_user_exist
函数来进行判断,这个函数在之前一篇文章已经做过阐述,这里我们就不做过多阐述。这里总共有三种情况:1、用户没注册直接登录。2、用户注册,但密码错误。3、登陆成功。
首先是第一种情况,如果当前用户在没有注册过,就告诉客户端该用户不存在即可。通过Json::Value创建Json对象,对其赋值,然后利用Json::FastWriter封装成string格式的文本信息即可实现Json数据的传输。返回的无格式Json数据如下:
{"cmd":"login_reply","result":"user_not_exist"}
然后是第二种情况,如果用户确实注册过,但输入的密码有误,那么就告诉客户端密码错误,返回的无格式Json数据如下:
{"cmd":"login_reply","result":"password_error"}
最后是第三种情况,当用户登录成功时,就需要向用户在线链表chatlist->online_user
中添加信息,其中包括用户名以及bufferevent的bev对象(该对象用于之后向好友发送消息)。并且需要获取用户的好友信息以及群信息一起发送给客户端,方便客户端界面显示。这里获取好友信息以及群信息通过my_database_get_friend_group
函数来实现,其主要是通过select friend from
以及 select chatgroup from
来实现,实现代码如下:
char sql[128] = {0};
/*获取好友列表*/
sprintf(sql,"select friend from %s;",name.c_str()); //查找用户名对应的好友列表
if(mysql_query(mysql,sql) != 0){
cout << "mysql_query error" << endl;
}
MYSQL_RES *res = mysql_store_result(mysql);
MYSQL_ROW row = mysql_fetch_row(res);
if(row[0] != NULL){
f.append(row[0]);
}
mysql_free_result(res); //释放res结果,防止内存泄露
/*获取群列表*/
memset(sql,0,sizeof(sql));
sprintf(sql,"select chatgroup from %s;",name.c_str()); //查找用户名对应的好友列表
if(mysql_query(mysql,sql) != 0){
cout << "mysql_query error" << endl;
}
res = mysql_store_result(mysql);
row = mysql_fetch_row(res);
if(row[0] != NULL){
g.append(row[0]);
}
随后向客户端发送Json对象数据,告诉客户端登录成功,同时返回获取的好友信息以及群信息。同时向每个在线好友发送当前登录者登录提醒,这里就要用到之前在线链表chatlist->online_user
的第二个参数bev了。通过bufferevent_write
向每个好友的bev中写入Json对象数据,这样每个好友都能接收到该Json对象,从而收到上线提醒。
for(list<User>::iterator it=chatlist->online_user->begin(); it!=chatlist->online_user->end(); it++){
if(name == it->name){ //如果mysql数据库中的好友在线,回复客户端:{"cmd":"friend_login","friend":"好友名"}
Json::Value v;
v["cmd"] = "friend_login";
v["friend"] = val["user"];
string s = Json::FastWriter().write(v);
if(bufferevent_write(it->bev,s.c_str(),strlen(s.c_str()))){ //注意这里是it->bev,是每个好友的bev对象
cout << "bufferevent_write error" << endl;
}
}
}
最后,用完数据库记得用mysql_close断开数据库连接!