网盘——添加好友

关于添加好友,过程如下:

A、首先客户端A发送加好友的请求,发送的信息包括双方的用户名

B、当服务器收到请求之后,服务器将数据库中在线用户查找出来,如果客户端B已经是你的好友了,服务器告诉客户端A他已经是你的好友了。如果不是好友且客户端B在线则转发好友请求,不在线直接回复加好友失败。

C、客户端B接受请求信息并回复答复信息给服务器

D、如果同意被添加好友,则在数据库中添加好友信息。发送同意或者拒绝信息发送给客户端A。

QT代码实现

1、首先右击加好友按钮,并且转到槽clicked

2、在客户端还有服务器这里添加协议,保持客户端服务器协议一致

   ENUM_MSG_TYPE_ADD_FRIEND_REQUEST,  //添加好友请求ENUM_MSG_TYPE_ADD_FRIEND_RESPOND,  //添加好友回复

3、获得左边的用户名

4、测试一下

void Online::on_addFriendpb_clicked()
{//发送当前点击的行,通过currentItem获得当前的文字信息QListWidgetItem *pItem = ui->online_lw->currentItem();qDebug()<< pItem->text();
}

可以看到,当我们添加22222和jack的时候,会打印出来这两个名字 

5、获取pItem的用户名以及本机的用户名

A、要加的好友的用户名

  QString strPerUsrName = pItem->text();

B、自己的用户名

在这里,直接在tcpclient里面定义一个,添加好友时候,自己的用户名

    QString m_strLoginName;

使得再登录的时候,直接将登录的用户名传给他

m_strLoginName = strName;

C、定义一个共有的接口去获得他

 QString loginName();
QString TcpClient::loginName()
{return  m_strLoginName;
}

D、在tcpclient里面获得本机用户名

 QString strLoginName = TcpClient::getinstance().loginName();

6、最后写你要添加谁,你是谁

void Online::on_addFriendpb_clicked()
{//发送当前点击的行,通过currentItem获得当前的文字信息QListWidgetItem *pItem = ui->online_lw->currentItem();//要加的好友的用户名QString strPerUsrName = pItem->text();//获得自己的名字QString strLoginName = TcpClient::getinstance().loginName();PDU *pdu = mkPDU(0);pdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_REQUEST;//你要添加谁?你是谁//获得数据的地址-要加的好友的用户名memcpy(pdu->caData, strPerUsrName.toStdString().c_str(), strPerUsrName.size());//登录的名字,往后放32个字节——自己的用户名memcpy(pdu->caData+32, strLoginName.toStdString().c_str(),strLoginName.size());   
}

7、将信息发送出去

void Online::on_addFriendpb_clicked()
{//发送当前点击的行,通过currentItem获得当前的文字信息QListWidgetItem *pItem = ui->online_lw->currentItem();//要加的好友的用户名QString strPerUsrName = pItem->text();//获得自己的名字QString strLoginName = TcpClient::getinstance().loginName();PDU *pdu = mkPDU(0);pdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_REQUEST;//你要添加谁?你是谁//获得数据的地址-要加的好友的用户名memcpy(pdu->caData, strPerUsrName.toStdString().c_str(), strPerUsrName.size());//登录的名字,往后放32个字节——自己的用户名memcpy(pdu->caData+32, strLoginName.toStdString().c_str(),strLoginName.size());//将信息发送出去TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);free(pdu);pdu=NULL;
}

8、操作服务器

8.1、定义加好友的函数

    //------------------------加好友--------------------------int handleAddFriend(const char *pername, const char *name);

8.2、在friend表里面添加数据

8.4、在服务器添加加好友的case

case ENUM_MSG_TYPE_ADD_FRIEND_REQUEST:{char caPerName[32] = {'\0'};char caName[32] ={'\0'};strncpy(caPerName, pdu->caData, 32);strncpy(caName, pdu->caData+32, 32);int ret = OperateDB::getInstance().handleAddFriend(caPerName,caName);PDU *respdu = NULL;if(-1==ret){respdu=mkPDU(0);respdu->uiMsgType=ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;strcpy(respdu->caData, UNKNOW_ERROR);//发送write((char*)respdu, respdu->uiPDULen);//释放空间free (respdu);respdu =NULL;}else if(0==ret){respdu=mkPDU(0);respdu->uiMsgType=ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;strcpy(respdu->caData, EXISTED_FRIEND);//发送write((char*)respdu, respdu->uiPDULen);//释放空间free (respdu);respdu =NULL;}else if(1==ret){//在线MyTcpServer::getInstance().reSend(caPerName,pdu);}else if(2==ret){respdu=mkPDU(0);respdu->uiMsgType=ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;strcpy(respdu->caData, ADD_FRIEND_OFFLINE);//发送write((char*)respdu, respdu->uiPDULen);//释放空间free (respdu);respdu =NULL;}else if(3==ret){respdu=mkPDU(0);respdu->uiMsgType=ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;strcpy(respdu->caData, ADD_FRIEND_NO_EXISTED);//发送write((char*)respdu, respdu->uiPDULen);//释放空间free (respdu);respdu =NULL;}break;}
int OperateDB::handleAddFriend(const char *pername, const char *name)
{//首先对形参的有效性做出判断if(NULL==pername||NULL==name){return -1;}//查看是否已经是自己的好友//我作为id,我的friendid里面有没有这个名字QString data = QString("select * from friend where (id=(select id from usrInfo where name = '\%1\') and friendId= (select id from usrInfo where name = '\%2\'))""or(id=(select id from usrInfo where name = '\%3\') and friendId=(select id from usrInfo where name = '\%4\'))").arg(pername).arg(name).arg(name).arg(pername);qDebug()<<data;QSqlQuery query;query.exec(data);if(query.next()){return 0;//双方已经是好友}else{data = QString("select online from usrInfo where name = \'%1\'").arg(pername);QSqlQuery query;query.exec(data);if(query.next()){//查看是否在线int ret = query.value(0).toUInt();if(1==ret){return 1;//不是好友 在线}else if(0==ret) {return 2;}}else {return  3;//对方不存在}}
}void OperateDB::handleAgreeAddfriend(const char *pername, const char *name)
{//首先对形参的有效性做出判断if(NULL==pername||NULL==name){return;}QString data = QString("insert into friend(id,friendId) values((select id from usrInfo where name=\'%1\'),(select id from usrInfo where name=\'%2\'))").arg(pername).arg(name);qDebug()<<data;QSqlQuery query;query.exec(data);
}

其中reSend的函数定义如下,这个是一个转发的函数,也就是将对方的名字传过来pername,pdu进行转发

void MyTcpServer::reSend(const char *pername, PDU *pdu)
{if(NULL==pername||NULL==pdu){return;}QString strName = pername;//遍历链表for(int i=0; i<m_tcpSocketList.size();i++){qDebug()<<m_tcpSocketList.at(i)->getName();if(strName==m_tcpSocketList.at(i)->getName()){m_tcpSocketList.at(i)->write((char*)pdu,pdu->uiPDULen);break;}}
}

8.5、添加好友的拒绝case

case  ENUM_MSG_TYPE_ADD_FRIEND_REFUSE:{char caName[32] ={'\0'};strncpy(caName, pdu->caData+32, 32);MyTcpServer::getInstance().reSend(caName,pdu);break;}

8.6、对消息类型进行判断

在resend里面,使用的是原来的pdu,但是原来的pdu消息类型还是friend request,所以说接收方那边需要对这两种消息类型进行判断

A、添加好友回复

case ENUM_MSG_TYPE_ADD_FRIEND_RESPOND:{QMessageBox::information(this,"添加好友",pdu->caData);break;}

B、添加好友同意或者拒绝代码

 case  ENUM_MSG_TYPE_ADD_FRIEND_AGGREE:{char caPerName[32] = {'\0'};strncpy(caPerName, pdu->caData, 32);QMessageBox::information(this,"添加好友",QString("添加%1好友成功").arg(caPerName));break;}case  ENUM_MSG_TYPE_ADD_FRIEND_REFUSE:{char caPerName[32] = {'\0'};strncpy(caPerName, pdu->caData, 32);QMessageBox::information(this,"添加好友",QString("添加%1好友失败").arg(caPerName));break;}

C、添加好友总的case

除了YES之外,其他的情况都属于是不同意

 case ENUM_MSG_TYPE_ADD_FRIEND_REQUEST:{//同意添加好友还是不同意添加好友char caName[32]={'\0'};strncpy(caName,pdu->caData+32,32);int ret = QMessageBox::information(this,"添加好友",QString("%1 what to add you as friend?").arg(caName),QMessageBox::Yes,QMessageBox::No);PDU *respdu =mkPDU(0);//将对方的名字添加进来memcpy(respdu->caData,pdu->caData,64);if(QMessageBox::Yes==ret){//同意添加这个好友respdu->uiMsgType=ENUM_MSG_TYPE_ADD_FRIEND_AGGREE;}else{//不同意添加这个好友respdu->uiMsgType=ENUM_MSG_TYPE_ADD_FRIEND_REFUSE;}m_tcpSocket.write((char*)respdu,respdu->uiPDULen);free(respdu);respdu=NULL;break;}

在这里只是将自己名字发送过去了,对方的名字也是需要发送过去的,服务器收到pdu的时候是要转发给对方的。如果这里没有对方的名字,就不知道怎么转发,不知道转发给谁,所以对方的名字也要写进去

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArkTs

一、概述 ArkTs是由TypeScript扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。 TypeScript语法: 线上网站:https://www.typescriptlang.org/zh/play 二、TS变量 变量声明: 常量声明: const b…

Ubuntu Vs code配置ROS开发环境

文章目录 1.开发环境2.集成开发环境搭建2.1 安装Ros2.2 安装 Vs code2.3 安装vs code 插件 3.Vs code 配置ROS3.1 创建ROS工作空间3.2 从文件夹启动Vs code3.3 使用Vscode 编译ROS 空间3.4 使用Vs code 创建功能包 4.编写简单Demo实例4.1编写代码4.2编译与执行 1.开发环境 系统…

【学习笔记】Python大数据处理与分析——Matplotlib数据可视化

一、绘图步骤 1、导入第三方库 import matplotlib.pyplot as plt import numpy as np 2、准备数据 x1 np.linspace(1, 10, 5) y1 np.sin(x1) 3、开始绘图 plt.plot(x1, y1, linewidth3) 4、完善图表 plt.title("plot figure") plt.xlabel("value of x&qu…

DC/DC电源模块直流升压变换器电压控制输出5V12V24V转0-50V80V110V150V180V200V250V300V500V800V1000V

特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~75℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压线性变化 应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、…

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码]

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种…

基于springboot实现大创管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现大创管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足&#xff0c;创建了一个计算机管理大创管理系统的方案。文章介…

【漏洞复现】云时空社会化商业ERP系统命令执行漏洞

01 漏洞描述 云时空社会化商业ERP系统存在命令执行漏洞&#xff0c;攻击者可以通过此漏洞获取服务器权限。 02 搜索语法 Fofa-Query: app"云时空社会化商业ERP系统" 03 漏洞复现 漏洞POC请查看公众号文章详情&#xff1a; 【漏洞复现】云时空社会化商业ERP系统命…

为什么要学习大模型应用开发?

1 学习大模型的重要性 底层逻辑 人工智能大潮已来&#xff0c;不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样&#xff0c;基本上你见不到。你问任何一个人问他会不会用PPT&#xff0c;他都会说会用&#xff0c;只是说好还是不好。你除非说这个岗位跟电脑完全无…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(二十八): 聚酰亚胺PI材料可以与哪些材料相互粘接?

聚酰亚胺PI材料可以与哪些材料相互粘接&#xff1f; 聚酰亚胺&#xff08;PI&#xff09;是一种具有特殊化学结构和物理性质的高分子材料&#xff0c;其耐高低温性能、高绝缘性、耐化性以及低热膨胀系数等特点使其被广泛应用于FPC基材和各种耐高温电机电器的绝缘材料。然而&…

2024 CKA 基础操作教程(十四)

题目内容 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context mk8s Task 现有的 Kubernetes 集群正在运行版本 1.29.0。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.29.1。 确保在升级之前 drain master 节点&#xff0c…

论文对比实验

目录 1 Denoising Diffusion Probabilistic Feature-Based Network for Cloud Removal in Sentinel-2 Imagery 2 Cloud Removal in Remote Sensing Using Sequential-Based Diffusion Models 3 Diffusion Enhancement for Cloud Removal in Ultra-Resolution Remote Sensin…

2024年第二届“天洑杯”数据建模大赛赛题答疑

“天洑杯”数据建模大赛旨在促进数据分析建模技术的推广和发展&#xff0c;培养一批具有用数据思维解决复杂问题能力的优秀人才&#xff0c;推动高水平人工智能交叉学科人才队伍建设。大赛鼓励参赛选手立足于自身的专业背景和工程实践技能&#xff0c;结合数据科学与人工智能相…