forked from yydcaib/TCPServer
完善但未调试的服务端
This commit is contained in:
parent
2992ccd00d
commit
5c7ac84acf
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 6.0.2, 2023-01-05T18:40:40. -->
|
||||
<!-- Written by QtCreator 6.0.2, 2023-01-07T18:36:10. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
|
|
132
datamanager.cpp
132
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define DATAMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QJsonDocument>
|
||||
|
||||
#include "database.h"
|
||||
#include "tcpserver.h"
|
||||
|
@ -23,6 +24,8 @@ private:
|
|||
TCPServer *server;
|
||||
QList <QTcpSocket*> online_socket_list;
|
||||
QList <QString> online_name_list;
|
||||
static DataManager *p_this;
|
||||
void update_namelist(QTcpSocket *sock);
|
||||
};
|
||||
|
||||
#endif // DATAMANAGER_H
|
||||
|
|
34
protocol.cpp
34
protocol.cpp
|
@ -26,24 +26,38 @@ QByteArray Protocol::data_builder(QList<any_types> &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:
|
||||
|
|
|
@ -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<tcp_socket_list.length();i++)
|
||||
|
@ -121,4 +126,4 @@ void TCPServer::sendToclient(QString ip, quint16 port, QByteArray data)
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
|
|
@ -15,7 +15,7 @@ public:
|
|||
void setServer(QString IP, qint16 port);
|
||||
void setCallBack(void (*callback)(QByteArray &data,QTcpSocket* socket));//Qt的信号-槽机制实际就是回调函数,
|
||||
void setCallBack(void (*callback)(QTcpSocket* socket)); //此处为练手,不使用该机制
|
||||
void sendToclient(QString ip, quint16 port, QByteArray data);
|
||||
void sendToclient(QTcpSocket *socket,QByteArray data);
|
||||
void stopRun();
|
||||
private:
|
||||
explicit TCPServer(QObject *parent = nullptr);
|
||||
|
|
Loading…
Reference in New Issue