Linux实现远程通信——下线(服务端)

下线

 在创建Json对象的数据后,客户端和服务端就可以依据这个类型的数据进行通信了。我们通过解析Json对象val中的cmd指令,也就是命令,来判断客户端是想要进行什么操作(用户注册?登录?聊天?),从而执行对应的函数操作。

if(cmd == "offline"){
        server_user_offline(bev,val);   //执行下线对应的函数
}

 用户下线时,要从在线用户链表中删除,当然你可以向所有在线的好友发送提醒,告知他们你下线了。
 首先,从在线用户链表chatlist->online_user中删除当前登录者的信息,因为该信息在用户登陆时会自动加入到该链表中。删除信息操作的具体实现如下:

for(list<User>::iterator it=chatlist->online_user->begin(); it!=chatlist->online_user->end(); it++){
        if(val["user"].asString() == it->name){
                chatlist->online_user->erase(it);              
                break;
        }
}

在线用户链表删除当前登录者的信息后,可以向该用户的所有在线好友发送下线提醒。首先需要连接用户数据库user,然后利用my_database_get_friend_group函数获取用户的好友信息,将每个好友单独解析出来后,查询该好友是否在在线用户链表中(即是否在线),如果在线就向他的bev发送下线提醒,代码实现如下:

chatdb->my_database_connect("user");
string friend_list,group_list;
string reply,name;
chatdb->my_database_get_friend_group(val["user"].asString(),friend_list,group_list);
Json::Value val1;                                               
int start = 0, end = 0,flag=1;
while(flag){
    	end = friend_list.find('|',start);           //查找s第一次出现位置,从start开始查找
    	if(end == -1){                          
            	name = friend_list.substr(start,friend_list.size() - start);
            	flag=0;
		}
    	name = friend_list.substr(start,end - start);
    	start = end + 1;                    
    	/*查找该好友是否在线,即是否在在线链表中*/
    	for(list<User>::iterator it=chatlist->online_user->begin(); it!=chatlist->online_user->end(); it++){
		        if(name == it->name){           
		                val1.clear();
		                val1["cmd"] = "friend_offline";
		                val1["friend_logout"] = val["user"];
		                reply = Json::FastWriter().write(val1);                                 
		                if(bufferevent_write(it->bev,reply.c_str(),strlen(reply.c_str()))){     
		                        cout << "bufferevent_write error" << endl;
		                }
		        }
    	}
}
chatdb->my_database_disconnect();

可以看到,服务端通过Json::Value创建Json对象,对其赋值,然后利用Json::FastWriter封装成string格式的文本信息即可实现Json数据的传输。返回的无格式Json数据如下:

{"cmd":"friend_offline","friend_logout":"好友名"}

最后,记得断开MYSQL数据库连接!方便下次调用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值