网盘——私聊

ops/2024/9/22 22:49:28/

在私聊这个功能实现中,具体步骤如下:

1、实现步骤:

A、客户端A发送私聊信息请求(发送的信息包括双方的用户名,聊天信息)

B、如果双方在线则直接转发给B,不在线则回复私聊失败,对方不在线

C、客户端B接收信息并显示

2、代码实现

2.1、构建私聊界面

A、添加私聊类PrivateChat

 

B、放置控件

2.2、添加信号槽

2.3、将聊天的对象传过来

    void setChatName(QString strName);
void PrivateChat::setChatName(QString strName)
{m_strChatName = strName;m_strLoginName=TcpClient::getinstance().loginName();
}

2.4、定义一个Qstring类型,保存当前聊天的名字

 QString m_strChatName;

2.5、为了方便使用聊天的窗口,将他写成单例模式

static PrivateChat &getInstance();
PrivateChat &PrivateChat::getInstance()
{static PrivateChat instance;return instance;
}

2.6、获得我方的名字,引入头文件

#include "tcpclient.h"

2.7、封装数据

A、添加私聊的协议

    ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST,  //私聊请求ENUM_MSG_TYPE_PRIVATE_CHAT_RESPOND,  //私聊回复
void PrivateChat::on_sendMSG_pb_clicked()
{//获得输入框的信息QString strMsg = ui->inputMsg_le->text();//发送完之后直接clear掉ui->inputMsg_le->clear();if(!strMsg.isEmpty()){//+1是后面追加一个\0PDU *pdu =mkPDU(strMsg.size()+1);pdu->uiMsgType=ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST;//将双方的名字拷贝进去memcpy(pdu->caData,m_strLoginName.toStdString().c_str(),m_strLoginName.size());memcpy(pdu->caData+32,m_strChatName.toStdString().c_str(),m_strChatName.size());//将聊天信息拷贝进去strcpy((char*)(pdu->caMsg),strMsg.toStdString().c_str());TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);free(pdu);pdu=NULL;}else{QMessageBox::warning(this,"私聊","发送的聊天信息不能为空");}
}

2.8、与之前的窗口进行关联

A、私聊槽函数处理

    void privateChat();

B、关联信号槽

    //关联私聊好友槽函数connect(m_pPrivateChatPB,SIGNAL(clicked(bool)), this, SLOT(privateChat()));

C、添加点击私聊好友的函数定义

void Friend::privateChat()
{if(NULL != m_pFriendListWidget->currentItem()){QString strChatName = m_pFriendListWidget->currentItem()->text();PrivateChat::getInstance().setChatName(strChatName);//显示窗口if(PrivateChat::getInstance().isHidden()){PrivateChat::getInstance().show();}}else{QMessageBox::warning(this,"私聊","请选择私聊的对象");}
}

2.9、在服务器端处理私聊请求

    case ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST:{char caPerName[32]={'\0'};memcpy(caPerName,pdu->caData+32,32);qDebug()<<caPerName;MyTcpServer::getInstance().reSend(caPerName,pdu);break;}

2.10、在客户端编写私聊回复

A、更新聊天信息

    //更新聊天信息void updateMsg(const PDU *pdu);
void PrivateChat::updateMsg(const PDU *pdu)
{if(NULL==pdu){return;}char caSendName[32]={'\0'};memcpy(caSendName,pdu->caData,32);QString strMsg = QString("%1 says: %2").arg(caSendName).arg((char*)(pdu->caMsg));//信息显示在界面上面ui->showMsg_te->append(strMsg);
}

B、添加私聊好友请求的case

    case ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST:{if(PrivateChat::getInstance().isHidden()){PrivateChat::getInstance().show();}char caSendName[32]={'\0'};memcpy(caSendName,pdu->caData,32);QString strSendName = caSendName;PrivateChat::getInstance().setChatName(strSendName);        PrivateChat::getInstance().updateMsg(pdu);break;}

C、测试

成功


http://www.ppmy.cn/ops/3143.html

相关文章

STM32 串口接收定长,不定长数据

本文为大家介绍如何使用 串口 接收定长 和 不定长 的数据。 文章目录 前言一、串口接收定长数据1. 函数介绍2.代码实现 二、串口接收不定长数据1.函数介绍2. 代码实现 三&#xff0c;两者回调函数的区别比较四&#xff0c;空闲中断的介绍总结 前言 一、串口接收定长数据 1. 函…

【TCP套接字编程,UDP套接字编程】

文章目录 TCP套接字编程Socket编程Socket 编程TCP套接字编程TCPsocket编程C/S socket 交互: TCP数据结构 sockaddr_in数据结构 hostent UDP套接字编程UDP Socket编程Client/server socket 交互: UDP TCP套接字编程 Socket编程 应用进程使用传输层提供的服务才能交换报文。实现…

2.4 Web容器配置:Tomcat

2.4 Web容器配置 2.4.1Tomcat配置1.常规配置2. HTTPS配置 *********** 2.4.1Tomcat配置 1.常规配置 在SpringBoot项目中&#xff0c;可以内置Tomcat、Jetly、Undertow、Netty等容器。 当开发者添加了spring-boot-starter-web依赖之后&#xff0c;默认会使用Tomcat作为Web容器…

qt之QSS常见属性

本文通过以下方式来设置QSS 控件名->setStyleSheet(""); 设置字体大小 font-size:18pt; 设置背景颜色 background-color:red; 或 background-color:#111111; 或 background-color:rgba(229,229,229,0); 注&#xff1a;rgba的最后一个值代表透明度 设置…

论文笔记:(INTHE)WILDCHAT:570K CHATGPT INTERACTION LOGS IN THE WILD

iclr 2024 spotlight reviewer 评分 5668 1 intro 由大型语言模型驱动的对话代理&#xff08;ChatGPT&#xff0c;Claude 2&#xff0c;Bard&#xff0c;Bing Chat&#xff09; 他们的开发流程通常包括三个主要阶段 预训练语言模型在被称为“指令调优”数据集上进行微调&…

原牛角源码(修罗bbs)全站程序打包带数据库备份

原牛角源码(修罗bbs)全站程序打包带数据库备份&#xff0c;牛角源码全站数据全站文件、插件打包分享给大家&#xff0c;有兴趣的可以搭建玩玩&#xff01; conf文件夹中自己配置conf.php里面的数据库链接文件&#xff0c;默认管理账号&#xff1a;admin&#xff0c;密码&#…

Java插值查找知识点(含面试大厂题和源码)

插值查找&#xff08;Interpolation Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它是基于二分查找&#xff08;Binary Search&#xff09;的改进版本&#xff0c;特别适合当数据分布均匀时使用。插值查找的关键思想是利用数据的分布特性&#xff0c;预测要查…

鸿蒙OpenHarmony【搭建Ubuntu环境】

搭建Ubuntu环境 在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3861、Hi3516…