diff --git a/TcpServer.pro.user b/TcpServer.pro.user index 93f1308..5edea4b 100644 --- a/TcpServer.pro.user +++ b/TcpServer.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/datamanager.cpp b/datamanager.cpp index c81d9f8..50b4cf7 100644 --- a/datamanager.cpp +++ b/datamanager.cpp @@ -1,23 +1,149 @@ #include "datamanager.h" - +DataManager *DataManager::p_this; DataManager::DataManager(QObject *parent) : QObject{parent} { + p_this = this; database = DataBase::getInstance(); protocol = Protocol::getInstance(); server = TCPServer::getInstance(); server->configAndrun(); server->setCallBack(disconnect_from_cln); server->setCallBack(recv_from_cln); - } void DataManager::disconnect_from_cln(QTcpSocket *sock) { - } void DataManager::recv_from_cln(QByteArray &data, QTcpSocket *sock) { + QByteArray data_decrypt; + data_decrypt = p_this->protocol->data_decrypt(data); + QJsonDocument json_data = QJsonDocument::fromJson(data_decrypt); + if (json_data["type"] == "message") + { + if(json_data["to_user"].toString().isEmpty()) + { + for (auto &one_socket:p_this->online_socket_list) + { + p_this->server->sendToclient(one_socket,data); + } + } + else + { + QString to_user = json_data["to_user"].toString(); + qDebug() << to_user; + for (int i = 0; i < p_this->online_name_list.length(); i++) + { + if(p_this->online_name_list.at(i) == to_user) + { + p_this->server->sendToclient(p_this->online_socket_list[i],data); + break; + } + } + } + } + else if (json_data["type"] == "file") + { + if(json_data["to_user"].toString().isEmpty()) + { + for (auto &one_socket:p_this->online_socket_list) + { + p_this->server->sendToclient(one_socket,data); + } + } + else + { + QString to_user = json_data["to_user"].toString(); + qDebug() << to_user; + for (int i = 0; i < p_this->online_name_list.length(); i++) + { + if(p_this->online_name_list.at(i) == to_user) + { + p_this->server->sendToclient(p_this->online_socket_list[i],data); + break; + } + } + } + } + else if (json_data["type"] == "request") + { + if (json_data["action"] == "register") + { + QString username,password; + QJsonObject json = json_data["content"].toObject(); + username = json["user"].toString(); + password = json["password"].toString(); + bool result = p_this->database->insertUsr(username,password); + QByteArray data_build,data_encrypt; + data_build = p_this->protocol->data_maker(Protocol::RESPONSE,QString("register"),result); + data_encrypt = p_this->protocol->data_encrypt(data_build); + p_this->server->sendToclient(sock,data_encrypt); + } + else if (json_data["action"] == "signin") + { + QString username,password; + QJsonObject json = json_data["content"].toObject(); + username = json["user"].toString(); + password = json["password"].toString(); + bool result = p_this->database->match(username,password); + qDebug() << result; + if(result == true) + { + p_this->online_socket_list.append(sock); + p_this->online_name_list.append(username); + } + QByteArray data_build,data_encrypt; + data_build = p_this->protocol->data_maker(Protocol::RESPONSE,QString("signin"),result); + data_encrypt = p_this->protocol->data_encrypt(data_build); + p_this->server->sendToclient(sock,data_encrypt); + p_this->update_namelist(sock); + } + else if (json_data["action"] == "cacellation") + { + + QString username = json_data["content"].toString(); + if(!p_this->database->Delete(username)) + { + return; + } + for (int i = 0; i < p_this->online_name_list.length(); i++) + { + if(p_this->online_name_list.at(i) == username) + { + p_this->online_name_list.removeAt(i); + p_this->online_socket_list.removeAt(i); + break; + } + } + p_this->update_namelist(sock); + } + else if (json_data["action"] == "update_namelist") + { + QByteArray data_build,data_encrypt; + data_build = p_this->protocol->data_maker(Protocol::ONLINEUSERS,4,p_this->online_name_list); + data_encrypt = p_this->protocol->data_encrypt(data_build); + p_this->server->sendToclient(sock,data_encrypt); + } + } + else + { + qDebug() << "服务端收到未知类型的数据"; + return; + } } + +void DataManager::update_namelist(QTcpSocket *sock) +{ + QByteArray data_build,data_encrypt; + data_build = protocol->data_maker(Protocol::ONLINEUSERS,4,online_name_list); + qDebug() << online_name_list; + data_encrypt = protocol->data_encrypt(data_build); + for (auto &one_socket:online_socket_list) + { + server->sendToclient(one_socket,data_encrypt); + } +} + diff --git a/datamanager.h b/datamanager.h index 6ad3a41..80ffa4a 100644 --- a/datamanager.h +++ b/datamanager.h @@ -2,6 +2,7 @@ #define DATAMANAGER_H #include +#include #include "database.h" #include "tcpserver.h" @@ -23,6 +24,8 @@ private: TCPServer *server; QList online_socket_list; QList online_name_list; + static DataManager *p_this; + void update_namelist(QTcpSocket *sock); }; #endif // DATAMANAGER_H diff --git a/protocol.cpp b/protocol.cpp index 98db9b4..a24a9a4 100644 --- a/protocol.cpp +++ b/protocol.cpp @@ -26,24 +26,38 @@ QByteArray Protocol::data_builder(QList &args) { case MESSAGE: { - if (args.length()==2) + if (args.length()==3) { data.insert("type","message"); - data.insert("data",args[1].get_string()); - } - else if (args.length()==3) - { - data.insert("type","message"); - data.insert("to_user",args[1].get_string()); + data.insert("sendname",args[1].get_string()); data.insert("data",args[2].get_string()); } + else if (args.length()==4) + { + data.insert("type","message"); + data.insert("sendname",args[1].get_string()); + data.insert("to_user",args[2].get_string()); + data.insert("data",args[3].get_string()); + } break; } case FILE: { - data.insert("type","file"); - data.insert("name",args[1].get_string()); - data.insert("data",args[2].get_string()); + if(args.length()==4) + { + data.insert("type","file"); + data.insert("sendname",args[1].get_string()); + data.insert("name",args[2].get_string()); + data.insert("data",args[3].get_string()); + } + else if(args.length()==5) + { + data.insert("type","file"); + data.insert("to_user",args[1].get_string()); + data.insert("sendname",args[2].get_string()); + data.insert("name",args[3].get_string()); + data.insert("data",args[4].get_string()); + } break; } case REQUEST: diff --git a/tcpserver.cpp b/tcpserver.cpp index eeca19a..401a510 100644 --- a/tcpserver.cpp +++ b/tcpserver.cpp @@ -110,7 +110,12 @@ void TCPServer::setCallBack(void (*callback)(QTcpSocket* socket)) disccallback = callback; } -void TCPServer::sendToclient(QString ip, quint16 port, QByteArray data) +void TCPServer::sendToclient(QTcpSocket *socket,QByteArray data) +{ + socket->write(data); +} + +/*void TCPServer::sendToclient(QString ip, quint16 port, QByteArray data) { QHostAddress addr(ip); for (int i=0;i