在私聊这个功能实现中,具体步骤如下:
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、测试
成功