欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

基于 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