libevent+QT即时通信项目——服务器链表设计(下)

通信

4.服务器链表设计

下:主要实现了获取每个群的成员,并且存到链表里

chat_databases.h .cpp

class ChatDataBases
{
    void my_database_get_group_member(const std::string groupName, std::string &member); //第一个参数群名,第二个是获取到的member数据
};

*****************************************
    
void ChatDataBases::my_database_get_group_member(const std::string groupName, std::string &member)
{
    //这里封装一下sql语句,因为要根据传进来的参数进行执行
    char sql[1024] = {0};
    sprintf(sql,"select member from %s;",groupName.c_str()); //sprintf接收的是char *
    if (mysql_query(mysql,sql) != 0 )
    {
        std::cout << "mysql_query error " << std::endl;
    }

    MYSQL_RES *res = mysql_store_result(mysql);
    if (!res)
    {
        std::cout << "mysql_store_result error" << std::endl;
    }
    
    //查询出来下面的结果,只有一行数据,直接存起来就行
    /*
    mysql> select member from 学习交流群1 ;
    +-----------------------------+
    | member                      |
    +-----------------------------+
    | 肥猪|狗杰|比凯|莎边         |
    +-----------------------------+
    */

    MYSQL_ROW row = mysql_fetch_row(res);
    
    if (row[0]) //将 row[0] 的值拼接到 member 字符串时,如果 row[0] 的值为 NULL,那么程序会崩溃。在执行拼接之前先判断一下
    {
        member += row[0];
    }
}

chatlist.cpp

ChatInfo::ChatInfo()
{
    onlineUser = new std::list<User>; //空

    group_info = new std::list<Group>; //群

    //往group_info链表里添加群信息
    //这里需要数据库的保存的群信息,所以要先创建好操作数据库的文件chat_databases

    //操作数据库
    mydatabase = new ChatDataBases();
    mydatabase->my_database_connect("chatgroup"); //连接

    std::string group_name[MAXGROUPNUM];
    int groupNum = mydatabase->my_database_get_group_name(group_name);

    //测试
    // std::cout << "群组数量为:" << groupNum << std::endl;
    // for (size_t i = 0; i < groupNum; ++i)
    // {
    //     std::cout << "群名" << i<< ": " << group_name[i] << std::endl;
    // }

    //一个群就是一个节点
    for (size_t i = 0; i < groupNum; i++)
    {
        Group  eachGroup;
        eachGroup.name = group_name[i];
        eachGroup.memberList = new std::list<GroupUser>; //成员列表

        //这里需要查询数据库,去查到每个群的群成员是什么 就是chatgroup的member字段的数据
        //然后添加到memberList链表当中
        std::string member; //接收member字段的数据 这样的格式:肥猪|狗杰|比凯|莎边
        mydatabase->my_database_get_group_member(group_name[i], member);

        //测试
        // std::cout << member << std::endl;

        //这里解析  肥猪|狗杰|比凯|莎边  然后存储  使用stl
        //1.创建一个字符串流对象,用于分割字符串
        std::stringstream smember(member);
        //2.分割下来的字符串用这个来存
        std::string element;
        //3.分割
        while (std::getline(smember, element, '|')) //流入的字符串对象
        {
            GroupUser groupMemberName; 
            groupMemberName.name = element;
            eachGroup.memberList->push_back(groupMemberName);

            //测试
            //std::cout << element << std::endl;
        }
        
        group_info->push_back(eachGroup);
    }

    //测试所有数据 打印群名字 后面是每个群的群成员
    // for(const auto& elem : *group_info)
    // {
    //     std::cout <<"群名:" << elem.name << std::endl;
    //     std::cout << "成员:";
    //     for(const auto& selem : *elem.memberList)
    //     {
    //         std::cout<< selem.name << " ";
    //     }
    //     std::cout << std::endl;
    // }

    std::cout <<"链表初始化成功\n"<< std::endl;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: int main int argc char argv[] { #ifdef Q OS LINUX QCoreApplication::setEventDispatcher new EventDispatcherLibEvent ; qInstallMessageHandler customMessageHandler ; #endif QCoreApplication a argc argv ; auto ser new ConfigServer; ser >startServer ; return a exec ; } 在 pro文件添加 linux{ LIBS + levent core SOURCES + common eventdispatcher libevent eventdispatcher libevent cpp common eventdispatcher libevent eventdispatcher libevent config cpp common eventdispatcher libevent eventdispatcher libevent p cpp common eventdispatcher libevent socknot p cpp common eventdispatcher libevent tco eventfd cpp common eventdispatcher libevent tco pipe cpp common eventdispatcher libevent tco cpp common eventdispatcher libevent timers p cpp HEADERS + common eventdispatcher libevent common h common eventdispatcher libevent eventdispatcher libevent h common eventdispatcher libevent eventdispatcher libevent config h common eventdispatcher libevent eventdispatcher libevent config p h common eventdispatcher libevent eventdispatcher libevent p h common eventdispatcher libevent libevent2 emul h common eventdispatcher libevent qt4compat h common eventdispatcher libevent tco h common eventdispatcher libevent wsainit h } 可以直接跨平台了使用了 csdn博客:http: blog csdn net rushroom">最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main文件添加: [更多]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值