网盘——显示在线用户

news2024/11/26 11:51:44

1、查看在线用户

客户端发送查看请求(只发送用户的名字),服务器将数据库中在线的用户查询出来并发送给客户端,客户端接收在线用户信息并作显示。

1.1、查看数据库的数据,在这里需要使用socket,所以我们在tcpclient.h里面写一个单例模式,那么在什么时候,都可以调用它

 static TcpClient &getinstance(); 
TcpClient &TcpClient::getinstance()
{
    static TcpClient instance;
    return  instance;
}

1.2、main.cpp里面就要修改为

#include "tcpclient.h"

#include <QApplication>
//#include "opewidget.h"
//#include "online.h"
//#include "friend.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //    TcpClient w;
    //    w.show();
    //    OpeWidget w;
    //    w.show();
    //    Online w;
    //    w.show();
    //    Friend w;
    //    w.show();
    TcpClient::getinstance().show();
    return a.exec();
}

1.3、封装一个发送函数,获得他的引用

QTcpSocket &getTcpSocket();
QTcpSocket &TcpClient::getTcpSocket()
{
    return  m_tcpSocket;
}

1.4、打包封装,在friend.cpp里引入协议头文件

#include "protocal.h"

1.5、编辑消息类型

    ENUM_MSG_TYPE_ALL_ONLINE_REQUEST,  //在线用户请求
    ENUM_MSG_TYPE_ALL_ONLINE_RESPOND,  //在线用户回复
    
    ENUM_MSG_TYPE_SEARCH_USER_REQUEST,  //搜索用户请求
    ENUM_MSG_TYPE_SEARCH_USER_RESPOND,  //搜索用户回复

将服务器那边的协议也改过来

1.6、showonline进行定义

void Friend::showOnline()
{
    //如果m_ponline是隐藏的,我们将他打开
    if(m_pOnline->isHidden()){
        m_pOnline->show();
        PDU *pdu =mkPDU(0);//产生协议数据单元
        pdu->uiMsgType = ENUM_MSG_TYPE_ALL_ONLINE_REQUEST;
        //将请求信息发送出去
        TcpClient::getinstance().getTcpSocket().write((char*)pdu, pdu->uiPDULen);
        //释放
        free(pdu);
        pdu = NULL;
    }
    else {
        m_pOnline->hide();
    }
}

1.7、服务器处理查看所有用户的请求

A、将所有在线用户的名字提取出来,返回,再通过socket写回到客户端

 //-------------------------------查看所有用户的请求-----------------
    case ENUM_MSG_TYPE_ALL_ONLINE_REQUEST:
    {
        
        break;
    }

B、在数据库operatedb.cpp里面添加处理所有在线用户的函数

QStringList handleAllOnline();

添加函数定义

QStringList OperateDB::handleAllOnline()
{
    QString data = QString("select name from usrInfo where online =1");
    QSqlQuery query;
    query.exec(data);
}

C、获得接口

QStringList OperateDB::handleAllOnline()
{
    QString data = QString("select name from usrInfo where online =1");
    QSqlQuery query;
    query.exec(data);
    
    QStringList result;
    result.clear();
    
    //循环的调用next函数,来获得每一条结果集
    while (query.next()) {
        result.append(query.value(0).toString());     
    }
    return  result;
}

D、返回到收数据的哪里

case ENUM_MSG_TYPE_ALL_ONLINE_REQUEST:
    {
        QStringList ret = OperateDB::getInstance().handleAllOnline();
        //产生多大的pdu,每一个名字占32个字节大小
        uint uiMsglen = ret.size()*32;
        PDU *respdu = mkPDU(uiMsglen);
        respdu->uiMsgType = ENUM_MSG_TYPE_ALL_ONLINE_RESPOND;
        //将用户名循环拷贝到这块空间里面去
        for(int i=0; i<ret.size(); i++){
            memcpy((char*)(respdu->caMsg)+i*32
                   ,ret.at(i).toStdString().c_str()
                   , ret.at(i).size());
        }
        
        //发送
        write((char*)respdu, respdu->uiPDULen);
        //释放空间
        free (respdu);
        respdu =NULL;
        break;
    }

1.8、在客户端接收数据

A、在tcpclient里面,最终会将在线用户信息显示在好友界面上,所以我们在好友frend.h里面写一个显示在线用户函数

void ShowAllOnlineUser(PDU *pdu);
void Friend::ShowAllOnlineUser(PDU *pdu)
{
    if(NULL==pdu){
        return;
    }
    m_pOnline->showUsr(pdu);
}

B、在online.h里面定义函数

void showUsr(PDU *pdu);
void Online::showUsr(PDU *pdu)
{
    if(NULL==pdu){
        return;
    }
    //每32个给他拷贝出来
    uint uiSize = pdu->uiMsgLen/32;
    char caTmp[32];
    for(uint i=0; i<uiSize; i++){
        memcpy(caTmp, (char*)(pdu->caMsg)+i*32,32);
        ui->online_lw->addItem(caTmp);
    }
}

1.9、测试

A、运行服务器

没登陆之前数据库的online字段都是0

B、登录两个账号

C、点击显示在线用户,可以看到jack和lucy

成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot相关报错解决

Caused by: java.lang.ClassNotFoundException: 目录 Caused by: java.lang.ClassNotFoundException: org.springframework.context.event.GenericApplicationListener spring-boot-dependencies:jar:2.1.9.RELEASE was not found org.springframework.context.event.Generi…

界面设计【1】-项目的UI设计css

引言&#xff1a; 本篇博客对简单的css html界面设计做了简要介绍 这篇博客主要就是介绍了做横向项目中&#xff0c;CSS界面设计与优化。 界面设计【1】-项目的UI设计css 1. 什么是css?2. css编程demo3. 可视化效果 1. 什么是css? CSS是层叠样式表&#xff08;Cascading S…

大型语言模型有什么用?

大型语言模型有什么用&#xff1f; 大型语言模型识别、总结、翻译、预测、生成文本和其他内容。 AI 应用程序正在总结文章、撰写故事和进行长时间对话——而大型语言模型正在承担繁重的工作。 大型语言模型或 LLM 是一种深度学习算法&#xff0c;可以根据从海量数据集中获得…

【PHP程序设计(高阶版)】——PHP操作MySQL教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Linux C应用编程:MQTT物联网

1 MQTT通信协议 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传 输&#xff09;是一种基于客户端-服务端架构的消息传输协议&#xff0c;如今&#xff0c;MQTT 成为了最受欢迎的物联网协议&#xff0c;已广泛应用于车联网、智能家居、即时聊…

TikTok怎么开通ads账户

一、TikTok的两种主流玩法 1、付费流量 蓝V认证TikTokAds&#xff08;广告消耗达到3w美金可申请蓝V认证&#xff09; 可以快速引流到独立站 2、免费流量 自己运营种草号、开直播 二、TikTok Ads如何开户&#xff1f; 开通广告账户 首先国内是无法自己申请TikTok Ads的&a…

精彩回顾 | 「AI 驱动增长,研发数智化升级」分享沙龙成功举办

AI 应用元年&#xff0c;人工智能技术将如何助力企业发展新质生产力&#xff0c;构建增长动能&#xff1f; 日前&#xff0c;LigaAI 与深圳市企业联合会、西云数据联合举办了「AI 驱动增长&#xff0c;研发数智化升级」技术专题沙龙。本次活动围绕「AI」应用实践&#xff0c;邀…

【QingHub】EMQX单节点一键部署

EMQX 简介 EMQX是全球最具扩展性的开源MQTT 代理&#xff0c;具有高性能&#xff0c;可在 1 个集群中连接 1 亿多个 IoT 设备&#xff0c;同时保持每秒 100 万条消息的吞吐量和亚毫秒级的延迟。 EMQX 支持MQTT、HTTP、QUIC、WebSocket等多种开放标准协议。它 100% 符合MQTT 5.…

电商技术揭秘十九:电商平台的智能化与自动化技术

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

Spring Web MVC的入门学习(二)

本篇接着Spring Web MVC的入门学习&#xff08;一&#xff09;-CSDN博客来继续学习Spring MVC。 一、从请求中获取Header 1、传统获取 header 获取Header也是从 HttpServletRequest 中获取。 代码&#xff1a; import jakarta.servlet.http.HttpServletRequest; import jakar…

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…

linux学习:栈(汉诺塔游戏)

第一根上面套着 64 个圆的金片&#xff0c;最大的一个在底下&#xff0c;其余一个比一个小&#xff0c;依次叠上去&#xff0c;庙里的众僧不倦地 把它们一个个地从这根棒搬到另一根棒上&#xff0c;规定可利用中间的一根棒作为帮助&#xff0c;但每次只能 搬一个&#xff0c;而…

【vue】v-model 双向数据绑定

:value&#xff1a;单向数据绑定v-model&#xff1a;双向数据绑定 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Maven创建项目

目录 1.创建项目 2.从Maven Repository: Search/Browse/Explore (mvnrepository.com)链接&#xff0c;下载API 3.1.0 3.在main文件内创建webapp文件夹&#xff0c;再webapp文件夹内创建WEB-INF文件夹&#xff0c;在WEB-INF文件夹内创建web.xml 4.网络编程 5.打包 6.部署 …

Leetcode二十三题:合并K个升序链表【22/1000 python】

“合并K个升序链表”&#xff0c;这是一道中等难度的题目&#xff0c;经常出现在编程面试中。以下是该问题的详细描述、解题步骤、不同算法的比较、代码示例及其分析。 问题描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中…

vue快速入门(十九)使用动态类绑定实现TabBar动态样式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 vue绑定动态样式根据点击事件获取当前点击部分序号 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width…

开源模型应用落地-chatglm3-6b-function call-入门篇(六)

一、前言 每个模型都有自己的限制&#xff0c;有些情况下它们无法满足复杂的业务需求。但是&#xff0c;可以通过一个外置函数的方式&#xff0c;例如&#xff1a;"Function Call"&#xff0c;让开发者能够更加灵活地利用大型语言模型&#xff0c;帮助开发者在特定场…

《QT实用小工具·十九》回车跳转到不同的编辑框

1、概述 源码放在文章末尾 该项目实现通过回车键让光标从一个编辑框跳转到另一个编辑框&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : p…

【Nacos】Nacos最新版的安装、配置过程记录和踩坑分享

Nacos是什么&#xff1f;有什么功能&#xff1f;大家可以自行联网&#xff08;推荐 https://cn.bing.com/&#xff09;搜索&#xff0c;这里就不做介绍了。 简单的看了下官网&#xff0c;安装最新版的Nacos&#xff08;v2.3.2&#xff09;需要使用到JDK&#xff08;1.8.0&…

JS原生DOM操作 - 获得元素/网页大小/元素宽高

文章目录 获得元素的方法获取页面元素位置宽高概念方法获得网页/元素宽高clientHeight和clientWidth&#xff1a;scrollHeight和scrollWidth&#xff1a;window.innerWidth&#xff1a;element.style.width&#xff1a; offsetXXX 获得网页元素的宽高和相对父元素位置&#xff…