在私聊这个功能实现中,具体步骤如下:
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是后面追加一个\0
PDU *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、测试
成功