基于 C++ 的网盘系统项目开发教程
最编程
2024-03-24 10:53:02
...
// 接收来自客户端的消息
void MyTcpSocket::recvMsg()
{
if(!m_bUpload)
{
qDebug() << this->bytesAvailable();
uint uiPDULen = 0;
this->read((char*)&uiPDULen,sizeof(uint));
uint uiMsgLen = uiPDULen - sizeof(PDU);
PDU *pdu = mkPDU(uiMsgLen);
this->read((char*)pdu+sizeof(uint),uiPDULen-sizeof(uint));
switch (pdu->uiMsgType)
{
// 注册请求
case ENUM_MSG_TYPE_REGIST_REQUEST:
{
char caName[32] = {'\0'};
char caPwd[32] = {'\0'};
strncpy(caName,pdu->caData,32);
strncpy(caPwd,pdu->caData+32,32);
bool res = OpeDB::getInstance().handleRegist(caName,caPwd);
PDU *respdu = mkPDU(0);
respdu->uiMsgType = ENUM_MSG_TYPE_REGIST_RESPOND;
if(res)
{
strcpy(respdu->caData,REGIST_OK);
QDir dir;
qDebug() << "create dir:" << dir.mkdir(QString("./%1").arg(caName));
}
else
{
strcpy(respdu->caData,REGIST_FAILED);
}
write((char*)respdu,respdu->uiPDULen);
free(respdu);
respdu = NULL;
break;
}
// 登录请求
case ENUM_MSG_TYPE_LOGIN_REQUEST:
{
char caName[32] = {'\0'};
char caPwd[32] = {'\0'};
strncpy(caName,pdu->caData,32);
strncpy(caPwd,pdu->caData+32,32);
bool res = OpeDB::getInstance().handleLogin(caName,caPwd);
PDU *respdu = mkPDU(0);
respdu->uiMsgType = ENUM_MSG_TYPE_LOGIN_RESPOND;
if(res)
{
strcpy(respdu->caData,LOGIN_OK);
m_strName= caName;
}
else
{
strcpy(respdu->caData,LOGIN_FAILED);
}
write((char*)respdu,respdu->uiPDULen);
free(respdu);
respdu = NULL;
break;
}
// 查看在线用户请求
case ENUM_MSG_TYPE_ALL_ONLINE_REQUEST:
{
QStringList res = OpeDB::getInstance().handleAllOnline();
uint uiMsgLen = res.size() * 32;
PDU *resPdu = mkPDU(uiMsgLen);
resPdu->uiMsgType = ENUM_MSG_TYPE_ALL_ONLINE_RESPOND;
for(int i = 0;i<res.size();i++)
{
memcpy((char*)(resPdu->caMsg) + i * 32,res.at(i).toStdString().c_str(),res.at(i).size());
}
write((char*)resPdu,resPdu->uiPDULen);
free(resPdu);
resPdu = NULL;
break;
}
// 查看查找用户请求
case ENUM_MSG_TYPE_SEARCH_USR_REQUEST:
{
int res = OpeDB::getInstance().handleSearchUsr(pdu->caData);
PDU *resPdu = mkPDU(0);
resPdu->uiMsgType = ENUM_MSG_TYPE_SEARCH_USR_RESPOND;
if(-1 == res)
{
strcpy(resPdu->caData,SEARCH_USR_NO);
}
else if(1 == res)
{
strcpy(resPdu->caData,SEARCH_USR_ONLINE);
}
else if(0 == res)
{
strcpy(resPdu->caData,SEARCH_USR_OFFLINE);
}
write((char*)resPdu,resPdu->uiPDULen);
free(resPdu);
resPdu = NULL;
break;
}
// 查看添加好友请求
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 res = OpeDB::getInstance().handleAddFriend(caPerName,caName);
qDebug() << "当前这个人在不在?" << res;
PDU *respdu = NULL;
if(-1== res)
{
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 == res)
{
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 == res)
{
MyTcpServer::getInstance().resend(caPerName,pdu);
}
else if(2 == res)
{
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 == res)
{
respdu = mkPDU(0);
respdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;
strcpy(respdu->caData,ADD_FRIEND_NO_EXIST);
write((char*)respdu,respdu->uiPDULen);
free(respdu);
respdu = NULL;
}
break;
}
case ENUM_MSG_TYPE_ADD_FRIEND_AGGREE:
{
char caPerName[32] = {'\0'};
char caName[32] = {'\0'};
strncpy(caPerName, pdu->caData, 32);
strncpy(caName, pdu->caData+32, 32);
OpeDB::getInstance().handleAgreeAddFriend(caPerName, caName);
MyTcpServer::getInstance().resend(caName, pdu);
break;
}
case ENUM_MSG_TYPE_ADD_FRIEND_REFUSE:
{
char caName[32] = {'\0'};
strncpy(caName, pdu->caData+32, 32);
MyTcpServer::getInstance().resend(caName, pdu);
break;
}
// 查看刷新在线好友列表请求
case ENUM_MSG_TYPE_FLUSH_FRIEND_REQUEST:
{
char caName[32] = {'\0'};
strncpy(caName, pdu->caData, 32);
QStringList res = OpeDB::getInstance().handleFlushFriend(caName);
uint uiMsglen = res.size() * 32;
PDU *respdu = mkPDU(uiMsglen);
respdu->uiMsgType = ENUM_MSG_TYPE_FLUSH_FRIEND_RESPOND;
for(int i = 0;i<res.size();i++)
{
memcpy((char*)(respdu->caMsg) + i * 32,res.at(i).toStdString().c_str(),res.at(i).size());
}
write((char*)respdu,respdu->uiPDULen);
free(respdu);
respdu = NULL;
break;
}
// 查看删除好友请求
case ENUM_MSG_TYPE_DELETE_FRIEND_REQUEST:
{
char caSelName[32] = {'\0'};
char caFriendName[32] = {'\0'};
strncpy(caSelName,pdu->caData,32);
strncpy(caFriendName,pdu->caData+32,32);
OpeDB::getInstance().handleDelFriend(caSelName,caFriendName);
PDU *respdu = mkPDU(0);
respdu->uiMsgType = ENUM_MSG_TYPE_DELETE_FRIEND_RESPOND;
strcpy(respdu->caData,DEL_FRIEND_OK);
write((char*)respdu,respdu->uiPDULen);
free(respdu);
respdu = NULL;
MyTcpServer::getInstance().resend(caFriendName,pdu);
break;
}
// 查看私聊请求
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;
}
// 查看群聊请求
case ENUM_MSG_TYPE_GROUP_CHAT_REQUEST:
{
char caName[32] = {'\0'};
strncpy(caName, pdu->caData, 32);
QStringList onlineFriend = OpeDB::getInstance().handleFlushFriend(caName);
QString temp;
for(int i = 0;i<onlineFriend.size();i++)
{
temp = onlineFriend.at(i);
MyTcpServer::getInstance().resend(temp.toStdString().c_str(),pdu);
}
break;
}
// 查看创建文件夹请求
case ENUM_MSG_TYPE_CREATE_DIR_REQUEST:
{
QDir dir;
QString strCurPath = QString("%1").arg((char*)(pdu->caMsg));
bool res = dir.exists(strCurPath);
PDU *respdu = NULL;
// 当前目录存在
if(res)
{
char caNewDir[32] = {'\0'};
memcpy(caNewDir,pdu->caData + 32,32);
QString strNewPath = strCurPath + "/" + caNewDir;
qDebug() << strNewPath;
res = dir.exists(strNewPath);
// 创建的文件名已存在
if(res)
{
respdu = mkPDU(0);
respdu->uiMsgType = ENUM_MSG_TYPE_CREATE_DIR_RESPOND;
strcpy(respdu->caData,FILE_NAME_EXIST);
}
// 创建的文件名不存在
else
{
dir.mkdir(strNewPath);
respdu = mkPDU(0);
respdu->uiMsgType = ENUM_MSG_TYPE_CREATE_DIR_RESPOND;
strcpy(respdu->caData,CREAT_DIR_OK);
}
}
// 当前目录不存在
else
{
respdu = mkPDU(0);
respdu->uiMsgType = ENUM_MSG_TYPE_CREATE_DIR_RESPOND;
strcpy(respdu->caData,DIR_NO_EXIST);
}
write((char*)respdu,respdu->uiPDULen);
free(respdu);
respdu = NULL;
break;
}
// 查看查看所有文件请求
case ENUM_MSG_TYPE_FLUSH_FILE_REQUEST:
{
char *pCurPath = new char[pdu->uiMsgLen];
memcpy(pCurPath,pdu->caMsg,pdu->uiMsgLen);
QDir dir(pCurPath);
QFileInfoList fileInfoList = dir.entryInfoList();
int iFileCount = fileInfoList.size();
PDU *respdu = mkPDU(sizeof(FileInfo) * iFileCount);
respdu->uiMsgType = ENUM_MSG_TYPE_FLUSH_FILE_RESPOND;
FileInfo *pFileInfo = NULL;
QString strFileName;
for(int i = 0;i<fileInfoList.size();i++)
{
pFileInfo = (FileInfo*)(respdu->caMsg) + i;
strFileName = fileI