Linux实现远程通信——用户登录(服务端)

用户登录

 在创建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断开数据库连接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值