群聊
在创建Json对象的数据后,客户端和服务端就可以依据这个类型的数据进行通信了。我们通过解析Json对象val中的cmd指令,也就是命令,来判断客户端是想要进行什么操作(用户注册?登录?聊天?),从而执行对应的函数操作。
if(cmd == "group_chat"){
server_group_chat(bev,val); //执行群聊对应的函数
}
既然用户可以群聊,说明用户已经添加该群,并在群里。那么群聊就直接打开群聊窗口,开始聊天即可。
群聊的实现主要是向群中所有用户发送信息。通过群链表chatlist->group_info
找到该群后,搜索群里所有用户的bev,向他们的bev缓存发送Json数据即可。具体代码实现如下:
for(list<Group>::iterator it=chatlist->group_info->begin(); it!=chatlist->group_info->end(); it++){
if(it->name == val["group"].asString()){
for(list<GroupUser>::iterator i=it->l->begin(); i!=it->l->end(); i++){
struct bufferevent *to_bev = chatlist->info_get_friend_bev(i->name);
if(to_bev != NULL){
string s = Json::FastWriter().write(val);
if(bufferevent_write(to_bev,s.c_str(),strlen(s.c_str()))){
cout << "bufferevent_write error" << endl;
}
}
}
}
}
发送完群聊文本信息后,服务端通过Json::Value创建Json对象,对其赋值,然后利用Json::FastWriter封装成string格式的文本信息即可实现Json数据的传输。返回的无格式Json数据如下:
{"cmd":"group_chat_reply","result":"success"}
服务端告诉客户端:群聊成功,信息已经发送。