diff --git a/TcpClient.pro.user b/TcpClient.pro.user index de9801f..585b555 100644 --- a/TcpClient.pro.user +++ b/TcpClient.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -85,176 +85,13 @@ true + + true + ProjectExplorer.Project.Target.0 - - Desktop - Desktop Qt 6.2.3 MinGW 64-bit - Desktop Qt 6.2.3 MinGW 64-bit - qt.qt6.623.win64_mingw_kit - 0 - 0 - 0 - - 0 - C:\Users\25761\Desktop\build-TcpClient-Desktop_Qt_6_2_3_MinGW_64_bit-Debug - C:/Users/25761/Desktop/build-TcpClient-Desktop_Qt_6_2_3_MinGW_64_bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - C:\Users\25761\Desktop\build-TcpClient-Desktop_Qt_6_2_3_MinGW_64_bit-Release - C:/Users/25761/Desktop/build-TcpClient-Desktop_Qt_6_2_3_MinGW_64_bit-Release - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - C:\Users\25761\Desktop\build-TcpClient-Desktop_Qt_6_2_3_MinGW_64_bit-Profile - C:/Users/25761/Desktop/build-TcpClient-Desktop_Qt_6_2_3_MinGW_64_bit-Profile - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - true - - 2 - - TcpClient2 - Qt4ProjectManager.Qt4RunConfiguration:C:/Users/25761/Desktop/tcpclient/TcpClient.pro - C:/Users/25761/Desktop/tcpclient/TcpClient.pro - false - true - true - false - true - C:/Users/25761/Desktop/build-TcpClient-Desktop_Qt_6_2_3_MinGW_64_bit-Debug - - 1 - - - - ProjectExplorer.Project.Target.1 Desktop Desktop Qt 6.2.3 MSVC2019 64bit @@ -265,8 +102,8 @@ 0 0 - C:\Users\25761\Desktop\build-TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Debug - C:/Users/25761/Desktop/build-TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Debug + C:\Users\25761\Desktop\Error-in-"-Util.asciify("build-C:\Users\25761\Desktop\tcpclient\TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Debug")":-SyntaxError:-Expected-token-`)' + C:/Users/25761/Desktop/Error-in-"-Util.asciify("build-C:/Users/25761/Desktop/tcpclient/TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Debug")":-SyntaxError:-Expected-token-`)' true @@ -304,8 +141,8 @@ 2 - C:\Users\25761\Desktop\build-TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Release - C:/Users/25761/Desktop/build-TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Release + C:\Users\25761\Desktop\Error-in-"-Util.asciify("build-C:\Users\25761\Desktop\tcpclient\TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Release")":-SyntaxError:-Expected-token-`)' + C:/Users/25761/Desktop/Error-in-"-Util.asciify("build-C:/Users/25761/Desktop/tcpclient/TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Release")":-SyntaxError:-Expected-token-`)' true @@ -345,8 +182,8 @@ 0 - C:\Users\25761\Desktop\build-TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Profile - C:/Users/25761/Desktop/build-TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Profile + C:\Users\25761\Desktop\Error-in-"-Util.asciify("build-C:\Users\25761\Desktop\tcpclient\TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Profile")":-SyntaxError:-Expected-token-`)' + C:/Users/25761/Desktop/Error-in-"-Util.asciify("build-C:/Users/25761/Desktop/tcpclient/TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Profile")":-SyntaxError:-Expected-token-`)' true @@ -406,20 +243,21 @@ 2 - Qt4ProjectManager.Qt4RunConfiguration:C:/Users/25761/Desktop/TcpClient/TcpClient.pro - C:/Users/25761/Desktop/TcpClient/TcpClient.pro + Qt4ProjectManager.Qt4RunConfiguration:C:\Users\25761\Desktop\tcpclient\TcpClient.pro + C:\Users\25761\Desktop\tcpclient\TcpClient.pro false true true false true + C:/Users/25761/Desktop/Error-in-"-Util.asciify("build-C:/Users/25761/Desktop/tcpclient/TcpClient-Desktop_Qt_6_2_3_MSVC2019_64bit-Debug")":-SyntaxError:-Expected-token-`)' 1 ProjectExplorer.Project.TargetCount - 2 + 1 ProjectExplorer.Project.Updater.FileVersion diff --git a/datamanager.cpp b/datamanager.cpp index c87c393..c6d81f5 100644 --- a/datamanager.cpp +++ b/datamanager.cpp @@ -1,5 +1,5 @@ #include "datamanager.h" - +//DataManager* DataManager::p_this; DataManager::DataManager(QObject *parent) : QObject{parent} { @@ -7,9 +7,11 @@ DataManager::DataManager(QObject *parent) tcpclient = TCPClient::getInstance(); connect(tcpclient,&TCPClient::TCPClientConnected,this,&DataManager::TCPClientConnected); connect(tcpclient,&TCPClient::TCPClientDisconnected,this,&DataManager::TCPClientDisconnected); + connect(tcpclient,&TCPClient::recv_data,this,&DataManager::recv_from_server); tcpclient->configAndrun(); - tcpclient->setCallBack(recv_from_server); + //tcpclient->setCallBack(recv_from_server); protocol = Protocol::getInstance(); + //p_this = this; } @@ -30,40 +32,111 @@ void DataManager::TCPClientDisconnected() { connect_flag = false; qDebug() << "emit disconnect_from_server successfully"; + //emit p_this->disconnect_from_server(); emit disconnect_from_server(); } -void DataManager::recv_from_server(QString &peerAddress, quint16 peerPort, QByteArray &data) +void DataManager::recv_from_server(QByteArray &data) { - // + QByteArray data_decrypt; + data_decrypt = protocol->data_decrypt(data); + QJsonDocument json_data = QJsonDocument::fromJson(data_decrypt); + if (json_data["type"] == "message") + { + QString data,sendname; + sendname = json_data["sendname"].toString(); + data = json_data["data"].toString(); + emit update_text(sendname,data); + } + else if (json_data["type"] == "file") + { + QString filename,file_data,sendname; + sendname = json_data["sendname"].toString(); + filename = json_data["name"].toString(); + file_data = json_data["data"].toString(); + emit update_file(sendname,filename,file_data); + } + else if (json_data["type"] == "online_users") + { + int count; + QList online_users; + count = json_data["count"].toInt(); + online_users = json_data["users"].toVariant().toStringList(); + emit update_users(count,online_users); + } + else if (json_data["type"] == "response") + { + if(json_data["action"] == "register") + { + bool register_flag; + register_flag = json_data["content"].toBool(); + emit signup_response(register_flag); + } + else if(json_data["action"] == "signin") + { + bool signin_flag; + signin_flag = json_data["content"].toBool(); + emit signin_response(signin_flag); + } + } + else + { + return; + } } void DataManager::Register(QString username,QString password) { - + QByteArray data,data_encrypt; + data = protocol->data_maker(Protocol::REQUEST,QString("register"),QList{username,password}); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); } void DataManager::signin_request(QString username,QString password) { - + QByteArray data,data_encrypt; + data = protocol->data_maker(Protocol::REQUEST,QString("signin"),QList{username,password}); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); } -void DataManager::send_text(QString text) +void DataManager::send_text(QString sendname,QString text) { - + QByteArray data,data_encrypt; + data = protocol->data_maker(Protocol::MESSAGE,sendname,text); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); } -void DataManager::send_file_to_all(QByteArray file) +void DataManager::send_to_user(QString sendname,QString to_user,QString text) { - + QByteArray data,data_encrypt; + data = protocol->data_maker(Protocol::MESSAGE,sendname,to_user,text); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); } -void DataManager::send_file_private(QByteArray file,QString name) +void DataManager::send_file_to_all(QString sendname,QString filename,QByteArray file) { + QByteArray data,data_encrypt; + data = protocol->data_maker(Protocol::FILE,sendname,filename,file); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); +} +void DataManager::send_file_private(QString sendname,QString filename,QByteArray file,QString name) +{ + QByteArray data,data_encrypt; + data = protocol->data_maker(Protocol::FILE,name,sendname,filename,file); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); } void DataManager::account_cancellation(QString username) { - + QByteArray data,data_encrypt; + data = protocol->data_maker(Protocol::REQUEST,QString("cancellation"),username); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); } diff --git a/datamanager.h b/datamanager.h index af52312..eef86fe 100644 --- a/datamanager.h +++ b/datamanager.h @@ -3,6 +3,7 @@ #include #include +#include #include "protocol.h" #include "tcpclient.h" @@ -15,11 +16,11 @@ public: private: explicit DataManager(QObject *parent = nullptr); - static void recv_from_server(QString &peerAddress,quint16 peerPort,QByteArray &data); + //static void recv_from_server(QString &peerAddress,quint16 peerPort,QByteArray &data); + //static Protocol *protocol; + //static DataManager *p_this; Protocol *protocol; TCPClient *tcpclient; - QString username; - QString password; bool connect_flag = false; signals: @@ -27,6 +28,10 @@ signals: void disconnect_from_server(); void signin_response(bool result); void signup_response(bool result); + void update_text(QString sendname,QString data); + void update_file(QString sendname,QString filename,QString file_data); + void update_users(int count,QListonline_users); + public slots: /*******ui界面********/ @@ -34,14 +39,16 @@ public slots: void signin_request(QString username,QString password); /******MAINWIDGET*****/ - void send_text(QString text); - void send_file_to_all(QByteArray file); - void send_file_private(QByteArray file,QString name); + void send_text(QString sendname,QString text); + void send_to_user(QString sendname,QString to_user,QString text); + void send_file_to_all(QString sendname,QString filename,QByteArray file); + void send_file_private(QString sendname,QString filename,QByteArray file,QString name); void account_cancellation(QString username); /******TCPClient******/ void TCPClientConnected(); void TCPClientDisconnected(); + void recv_from_server(QByteArray &data); }; diff --git a/login.cpp b/login.cpp index 6b9f665..0774a14 100644 --- a/login.cpp +++ b/login.cpp @@ -167,9 +167,13 @@ void Login::signin_response(bool result) { mainwidget = new MainWidget(user); connect(mainwidget,&MainWidget::send_text,datamanager,&DataManager::send_text); + connect(mainwidget,&MainWidget::send_to_user,datamanager,&DataManager::send_to_user); connect(mainwidget,&MainWidget::send_file_private,datamanager,&DataManager::send_file_private); connect(mainwidget,&MainWidget::send_file_to_all,datamanager,&DataManager::send_file_to_all); connect(mainwidget,&MainWidget::account_cancellation,datamanager,&DataManager::account_cancellation); + connect(datamanager,&DataManager::update_text,mainwidget,&MainWidget::update_text); + connect(datamanager,&DataManager::update_file,mainwidget,&MainWidget::update_file); + connect(datamanager,&DataManager::update_users,mainwidget,&MainWidget::update_users); connect(mainwidget,&MainWidget::exit_client,this,&Login::exit_client); this->hide(); mainwidget->show(); @@ -180,16 +184,6 @@ void Login::signin_response(bool result) } } -void Login::slot_Register(QString username,QString password) -{ - if(connect_flag == false) - { - QMessageBox::warning(signup, "注册失败", "尚未连接服务器!请连接服务器后重试"); - return; - } - emit Register(username,password); -} - //等待服务器注册数据 void Login::signup_response(bool result) { @@ -204,6 +198,17 @@ void Login::signup_response(bool result) } } +//注册界面按下注册按键 +void Login::slot_Register(QString username,QString password) +{ + if(connect_flag == false) + { + QMessageBox::warning(signup, "注册失败", "尚未连接服务器!请连接服务器后重试"); + return; + } + emit Register(username,password); +} + //连接上服务器 void Login::connected() { diff --git a/mainwidget.cpp b/mainwidget.cpp index 92c88b1..56a0dc7 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -127,7 +127,18 @@ void MainWidget::on_send_btn_clicked() ui->msg_edit->clear(); QString currentTime = QTime::currentTime().toString("H:m A"); ui->textEdit->append("" + username + " [" + currentTime + "] : " + text + ""); - emit send_text(text); + if(text[0] == '@') + { + int n = text.indexOf(' '); + QString to_user = text.mid(1,n-1); + QString insert = "tell you quietly:"; + text = insert + text.mid(n,-1); + emit send_to_user(username,to_user,text); + } + else + { + emit send_text(username,text); + } } @@ -190,8 +201,7 @@ void MainWidget::sendFile(QString filePath,QString filename,QString name) //打开文件流,以写的方式打开 QDataStream out(&block,QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_5_8); - QString command = filename+"\n"; - out << command; + //将数据读取到QByteArray QByteArray dataOfFile = file.readAll(); //关闭文件 @@ -201,15 +211,31 @@ void MainWidget::sendFile(QString filePath,QString filename,QString name) if(name.isEmpty()) //群发文件 { - emit send_file_to_all(block); + emit send_file_to_all(name,filename,block); } else //私发文件 { - emit send_file_private(block,name); + emit send_file_private(name,filename,block,name); } } +void MainWidget::update_text(QString sendname,QString data) +{ + QString currentTime = QTime::currentTime().toString("H:m A"); + ui->textEdit->append(sendname + " [" + currentTime + "] : " + data); +} + +void MainWidget::update_file(QString sendname,QString filename,QString file_data) +{ + +} + +void MainWidget::update_users(int count,QListonline_users) +{ + +} + bool MainWidget::eventFilter(QObject *target, QEvent *event) { if(target == ui->msg_edit) //可替换 diff --git a/mainwidget.h b/mainwidget.h index 50be97c..eebd3f6 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -27,24 +28,24 @@ public: bool eventFilter(QObject *target, QEvent *event); signals: - void send_text(QString text); - void send_file_to_all(QByteArray file); - void send_file_private(QByteArray file,QString name); + void send_text(QString sendname,QString text); + void send_to_user(QString sendname,QString to_user,QString test); + void send_file_to_all(QString sendname,QString filename,QByteArray file); + void send_file_private(QString sendname,QString filename,QByteArray file,QString name); void exit_client(); void account_cancellation(QString username); private slots: void on_send_text_clicked(); - void on_save_btn_clicked(); - void on_send_btn_clicked(); - void on_name_list_itemDoubleClicked(QListWidgetItem *item); - void on_exit_btn_clicked(); - void on_stop_clicked(); +public slots: + void update_text(QString sendname,QString data); + void update_file(QString sendname,QString filename,QString file_data); + void update_users(int count,QListonline_users); private: Ui::MainWidget *ui; 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/tcpclient.cpp b/tcpclient.cpp index e4bf864..2c43567 100644 --- a/tcpclient.cpp +++ b/tcpclient.cpp @@ -85,6 +85,7 @@ void TCPClient::readSocket() printf("TCPC Message:%.*s\n",recv.size(),(char *)recv.data()); if (_callback != nullptr) _callback(ip, socket.peerPort(),recv); + emit recv_data(recv); } void TCPClient::setCallBack(void (*callback)(QString &mac, quint16 port, QByteArray &data)) diff --git a/tcpclient.h b/tcpclient.h index 9891567..1cef511 100644 --- a/tcpclient.h +++ b/tcpclient.h @@ -12,7 +12,7 @@ public: static TCPClient* getInstance(); static void sendToserver(QByteArray &data); void configAndrun(); - void setCallBack(void (*callback)(QString &ip, quint16 port, QByteArray &data)); + void setCallBack(void (*callback)(QString &ip, quint16 port,QByteArray &data)); void setServer(QString IP, qint16 port); private slots: void readSocket(); @@ -27,10 +27,11 @@ private: QString server_ip = "127.0.0.1"; qint16 server_port = 7890; bool has_found = false; - void (*_callback) (QString &ip, quint16 port, QByteArray &data)=nullptr; + void (*_callback) (QString &ip, quint16 port,QByteArray &data)=nullptr; signals: void TCPClientConnected(); void TCPClientDisconnected(); + void recv_data(QByteArray data); };