网盘——私聊

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

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.mzph.cn/pingmian/731.shtml

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

相关文章

Sping源码(七)—ConfigurationClassPostProcessor创建流程

序言 前两篇文章介绍了invokeBeanFactoryPostProcessors的执行流程&#xff0c;和自定义实现BeanDefinitionRegistryPostProcessor类的方式方法。 这篇文章会主要介绍Spring启动加载xml时&#xff0c;ConfigurationClassPostProcessor类是如何加载到Spring中&#xff0c;并且…

【数学建模】最优旅游城市的选择问题:层次分析模型(含MATLAB代码)

层次分析法&#xff08;The analytic hierarachy process&#xff0c;简称AHP&#xff09;是一种常用的决策分析方法&#xff0c;其基本思路是将复杂问题分解为多个组成部分&#xff0c;然后对这些部分进行逐一评估和比较&#xff0c;最后得出最优解决方案。&#xff08;例如&a…

JVM知识点总结二

参考文章&#xff1a;【Java面试题汇总】JVM篇&#xff08;2023版&#xff09;_jvm面试题2023-CSDN博客 1、说说你了解的JVM内存模型&#xff1a; JVM由三部分组成&#xff1a;类加载子系统、运行时数据区、执行引擎 JVM内存模型&#xff1a; 内存模型里的运行时数据区&#…

ruby 配置代理 ip(核心逻辑)

在 Ruby 中配置代理 IP&#xff0c;可以通过设置 Net::HTTP 类的 Proxy 属性来实现。以下是一个示例&#xff1a; require net/http// 获取代理Ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg proxy_address 代理IP:端口 uri URI(http://www.example.com)Net:…

机器学习 | 使用Scikit-Learn实现分层抽样

在本文中&#xff0c;我们将学习如何使用Scikit-Learn实现分层抽样。 什么是分层抽样&#xff1f; 分层抽样是一种抽样方法&#xff0c;首先将总体的单位按某种特征分为若干次级总体&#xff08;层&#xff09;&#xff0c;然后再从每一层内进行单纯随机抽样&#xff0c;组成…

Django项目使用uwsgi+nginx部署上线

Django项目使用uwsginginx部署上线 前言settings 配置安装uwsgi 和配置uwsgi推荐配置文件启用wsgi不使用nginx的配置&#xff08;不推荐&#xff09;使用nginx的配置 安装 nginx和配置niginx 配置 运行参考资料 前言 代码已经开发完成&#xff0c;正式部署上线 settings 配置…

Redmi Turbo 3新品发布,天星金融(原小米金融)优惠加持护航新机体验

Redmi新十年使命不变&#xff0c;挑战不断升级。Redmi Turbo 3&#xff0c;作为Turbo系列的开篇之作&#xff0c;将自身定位为新生代性能旗舰&#xff0c;决心重塑中端性能新格局。据悉&#xff0c;Redmi Turbo 3于4月10日已正式发布。预售期间更是连续数日&#xff0c;蝉联小米…

SSL证书在HTTP与HTTPS中的角色差异是什么?

在互联网的广泛应用背景下&#xff0c;随着网络攻击和数据泄露事件频发&#xff0c;保障用户的数据安全已成为至关重要的议题。传统的HTTP协议在传输数据时不进行加密处理&#xff0c;导致数据在传输过程中暴露于潜在的窃听和篡改风险中&#xff0c;安全性薄弱。而通过引入SSL/…

解决Keil V5.38 和 ST-Link V3 Debug不能运行问题

目录 概述 1 问题描述 1.1 情况一 1.2 情况二 1.3 情况三 2 解决方法 2.1 认识Keil Mico Lib 2.2 使能Keil Mico Lib 3 验证 3.1 进入C程序Main验证 3.2 断点验证 3.3 上电重启验证 4 结论 笔者使用的验证代码下载地址&#xff1a; stm32-freeRTOS-queue资源-CSD…

微信小程序日期增加时间完成订单失效倒计时(有效果图)

效果图 .wxml <view class"TimeSeond">{{second}}</view>.js Page({data: {tiem_one:,second:,//倒计时deadline:,},onLoad(){this.countdown();},countdown(){let timestamp Date.parse(new Date()) / 1000;//当前时间戳let time this.addtime(2024…

k8s 部署 kube-prometheus监控

一、Prometheus监控部署 1、下载部署文件 # 使用此链接下载后解压即可 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/release-0.13.zip2、根据k8s集群版本获取不同的kube-prometheus版本部署 https://github.com/prometheus-operator/k…

VSCode断点调试(ROS)

0、安装ros插件 在扩展商店中安装ROS插件&#xff08;Microsoft&#xff09; 1、修改CMakeList.txt # set(CMAKE_BUILD_TYPE "Release") // 注释Release模式 set(CMAKE_BUILD_TYPE "Debug") // 设置为Debug模式 # set(CMAKE_CXX_FLAGS_RELEASE &…

递归、搜索与回溯算法:回溯,决策树

回溯算法是⼀种经典的递归算法&#xff0c;通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从⼀个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态⽆法前进时&#xff0c;回退到前⼀个状态&#xff0c;再按照其他…

Hadoop3:大数据的基本介绍

一、什么是大数据 1、大数据的4v特点 Volume&#xff08;大量&#xff09; Velocity&#xff08;高速&#xff09; Variety&#xff08;多样&#xff09; Value&#xff08;低价值密度&#xff09; 2、大数据部门间的工作岗位 第三部分&#xff0c;其实就是JavaWeb 二、…

用 element ui 实现季度选择器

由于在数据项目中经常以各种时间条件查询数据&#xff0c;所以时间选择器&#xff08;DatePicker&#xff09;组件是很常用的组件。但是在我使用的 Element UI 中&#xff0c;缺少了季度选择器的功能。 简易实现 一开始我根据时间范围使用 select 去遍历,如 2024-Q1、2023-Q4…

cdp集群Hbase组件HRegionServer服务停止原因以及排查

前言&#xff1a;重启集群后某一节点HRegionServer服务停止&#xff0c;重启前所有服务均正常 去查看日志&#xff1a; 日志报错 ERROR HRegionServer Master rejected startup because clock is out of sync org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.h…

Spark-Scala语言实战(17)

我带着大家一起来到Linux集群环境下&#xff0c;学习我们的spark。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&#xff08;16&#x…

linux 基础命令docker及防火墙iptables详解

应用场景&#xff1a; web应用自动打包和发布 自动化测试&#xff0c;持续集成、发布 在服务环境中部署后台应用 搭建paaS平台 安装应用 apt install docker.io#kali中 配置docker源&#xff0c;文件位置/etc/docker/daemon.json { "registry-mirrors": [ "h…

机器学习和深度学习-- 李宏毅(笔记于个人理解)Day 21

Day 21 Self- Attention 选修部分 ​ 学完自适应 再回来看看 Sequence Labling 假如我们现在有一个需要读完全部句子才能解的问题&#xff0c; 那么red window 就需要变得是最大的&#xff08;最长的句子&#xff09;&#xff1b; 其实这里大家有没有想过&#xff0c;这个玩意…

死磕GMSSL通信-java/Netty系列(二)

死磕GMSSL通信-java/Netty系列(二) 在上一篇文章中,我们探讨了如何利用C/C++实现国密通信。而本文将聚焦于Java环境下,特别是基于Netty框架,如何实现与国密系统的安全通信。为了确保新项目遵循最新的国密标准,我们将优先推荐使用GB/T 38636-2020(TLCP)协议。对于Java开…