├── .gitignore ├── JQNetwork.pro ├── README.md ├── builder ├── JQNetworkLibBuilder │ └── JQNetworkLibBuilder.pro └── builder.pro ├── demos ├── FileTransferDemo │ ├── FileTransferClientDemo │ │ ├── FileTransferClientDemo.pro │ │ └── cpp │ │ │ └── main.cpp │ ├── FileTransferDemo.pro │ └── FileTransferServerDemo │ │ ├── FileTransferServerDemo.pro │ │ └── cpp │ │ ├── main.cpp │ │ └── myserver.hpp ├── LanNodeSearchDemo │ ├── LanNodeSearchDemo.pro │ └── cpp │ │ └── main.cpp ├── PingPongDemo │ ├── PingDemo │ │ ├── PingDemo.pro │ │ └── cpp │ │ │ ├── main.cpp │ │ │ └── ping.hpp │ ├── PingPongDemo.pro │ └── PongDemo │ │ ├── PongDemo.pro │ │ └── cpp │ │ ├── main.cpp │ │ └── pong.hpp ├── UserLoginDemo │ ├── UserLoginClientDemo │ │ ├── UserLoginClientDemo.pro │ │ ├── cpp │ │ │ └── main.cpp │ │ └── qml │ │ │ ├── main.qml │ │ │ └── qml.qrc │ ├── UserLoginDemo.pro │ └── UserLoginServerDemo │ │ ├── UserLoginServerDemo.pro │ │ └── cpp │ │ ├── main.cpp │ │ └── myserver.hpp └── demos.pro ├── doc └── MindNode │ ├── 处理器.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 客户端.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 数据包结构.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 服务端.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 职责映射.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 节点标记.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 节点配置.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 转发节点.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 连接池.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ ├── 连接节点.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ │ ├── contents.xml │ │ └── metadata.plist │ └── viewState.plist │ └── 通讯流程.mindnode │ ├── contents.xml │ ├── style.mindnodestyle │ ├── contents.xml │ └── metadata.plist │ └── viewState.plist ├── sharedlibrary └── JQNetwork │ ├── JQNetwork.pri │ ├── include │ ├── JQNetwork │ ├── JQNetworkClient │ ├── JQNetworkClientForQml │ ├── JQNetworkConnect │ ├── JQNetworkConnectPool │ ├── JQNetworkEncrypt │ ├── JQNetworkFoundation │ ├── JQNetworkLan │ ├── JQNetworkPackage │ ├── JQNetworkProcessor │ ├── JQNetworkServer │ ├── jqnetwork_client.h │ ├── jqnetwork_client.inc │ ├── jqnetwork_clientforqml.h │ ├── jqnetwork_clientforqml.inc │ ├── jqnetwork_connect.h │ ├── jqnetwork_connect.inc │ ├── jqnetwork_connectpool.h │ ├── jqnetwork_connectpool.inc │ ├── jqnetwork_foundation.h │ ├── jqnetwork_foundation.inc │ ├── jqnetwork_lan.h │ ├── jqnetwork_lan.inc │ ├── jqnetwork_package.h │ ├── jqnetwork_package.inc │ ├── jqnetwork_processor.h │ ├── jqnetwork_processor.inc │ ├── jqnetwork_server.h │ └── jqnetwork_server.inc │ ├── qml │ ├── JQNetwork │ │ ├── JQNetworkClient.qml │ │ └── qmldir │ └── JQNetworkQml.qrc │ └── src │ ├── jqnetwork_client.cpp │ ├── jqnetwork_clientforqml.cpp │ ├── jqnetwork_connect.cpp │ ├── jqnetwork_connectpool.cpp │ ├── jqnetwork_foundation.cpp │ ├── jqnetwork_lan.cpp │ ├── jqnetwork_package.cpp │ ├── jqnetwork_processor.cpp │ └── jqnetwork_server.cpp └── tester ├── JQNetworkBenchmark ├── JQNetworkBenchmark.pro └── cpp │ ├── jqnetwork_benchmark.cpp │ ├── jqnetwork_benchmark.h │ └── main.cpp ├── JQNetworkOverallTest ├── JQNetworkOverallTest.pro └── cpp │ ├── fusiontest1.hpp │ ├── fusiontest2.hpp │ ├── jqnetwork_overalltest.cpp │ ├── jqnetwork_overalltest.h │ ├── main.cpp │ ├── processortest1.hpp │ └── processortest2.hpp ├── JQNetworkPersisteneTest ├── JQNetworkPersisteneTest.pro └── cpp │ ├── jqnetwork_persistenetest.cpp │ ├── jqnetwork_persistenetest.h │ └── main.cpp └── tester.pro /.gitignore: -------------------------------------------------------------------------------- 1 | ### JQNetworkLib ### 2 | sharedlibrary/JQNetwork/bin 3 | 4 | ### C++ ### 5 | # Prerequisites 6 | *.d 7 | 8 | # Compiled Object files 9 | *.slo 10 | *.lo 11 | *.o 12 | *.obj 13 | 14 | # Precompiled Headers 15 | *.gch 16 | *.pch 17 | 18 | # Fortran module files 19 | *.mod 20 | *.smod 21 | 22 | 23 | ### Qt ### 24 | 25 | # Qt-es 26 | 27 | /.qmake.cache 28 | /.qmake.stash 29 | *.pro.user 30 | *.pro.user.* 31 | *.qbs.user 32 | *.qbs.user.* 33 | *.moc 34 | moc_*.cpp 35 | qrc_*.cpp 36 | ui_*.h 37 | Makefile* 38 | *build-* 39 | 40 | # QtCreator 41 | 42 | *.autosave 43 | 44 | # QtCtreator Qml 45 | *.qmlproject.user 46 | *.qmlproject.user.* 47 | 48 | # QtCtreator CMake 49 | CMakeLists.txt.user* 50 | 51 | ### macOS ### 52 | *.DS_Store 53 | 54 | -------------------------------------------------------------------------------- /JQNetwork.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | TEMPLATE = subdirs 14 | 15 | CONFIG += ordered 16 | 17 | SUBDIRS += builder 18 | SUBDIRS += tester 19 | SUBDIRS += demos 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 介绍 2 | 3 | JQNetwork,为 Jason Qt Netowrk 的简称 4 | 5 | JQNetwork是基于Qt开发,并且未使用除了 C++标准库 和 Qt 之外的第三方库,保证了库的可移植性以及库的纯粹性 6 | 7 | 所有的传输数据的地方,都使用了TCP长连接,保证了传输数据的可靠性 8 | 9 | #### 用到的Qt库有: 10 | 11 | * core 12 | * network 13 | * concurrent 14 | * qml(扩展,非必须) 15 | * testlib(测试用,运行不需要) 16 | 17 | 理论上可以部署到任何Qt支持的平台上。 18 | 19 | 推荐使用Linux系统或者Unix系统,因为在5.7后,Qt更换了Unix相关系统的底层模型,从select更换为了poll,这样改进后,并发就脱离了1024个的限制。 20 | 21 | 使用本库,需要 Qt5.7.0 或者更高版本,以及支持 C++14 的编译器(VS2015或者更高),对操作系统无要求。 22 | 23 | 本库源码均已开源在了GitHub上。 24 | 25 | GitHub地址:https://github.com/188080501/JQNetwork 26 | 27 | 方便的话,帮我点个星星,或者反馈一下使用意见,这是对我莫大的帮助。 28 | 29 | 若你遇到问题、有了更好的建议或者想要一些新功能,都可以直接在GitHub上提交Issues:https://github.com/188080501/JQNetwork/issues 30 | 31 | 或者直接邮件我,我的邮箱是:Jason@JasonServer.com 32 | 33 | ## 功能 34 | 35 | 功能|状态|实现版本 36 | ---|---|--- 37 | TCP长连接|已实现|V0.1 38 | 全双工|已实现|V0.1 39 | 全异步|已实现|V0.1 40 | 多线程|已实现|V0.1 41 | 大数据量支持|已实现|V0.2 42 | 小数据包插队传输|已实现|V0.2 43 | 数据压缩|已实现|V0.3 44 | 局域网自组网|已实现|V0.4 45 | 大文件传输支持|已实现|V0.5 46 | SSL支持|等待开发|V1.0 47 | 48 | ## 性能介绍 49 | 50 | 本库性能只能说一般般,底层是poll注定了性能不是强项,以下是我在我电脑( iMac(i5-4670) + 127.0.0.1 )上,测出的性能。 51 | 52 | * 1个TCP长连接(127.0.0.1)向服务端连续发送 4Byte 数据,服务端连续返回 4Byte 数据,每秒可以达 36569 次 53 | 54 | * 1个TCP长连接(127.0.0.1)向服务端连续发送 32KB 数据,服务端连续返回 32KB 数据,每秒可以达 3430 次,单向载荷传输速度可以达 856 Mbit/s 55 | 56 | * 1个TCP长连接(127.0.0.1)与服务端来回发送(PingPong) 4Byte 数据,每秒可以达 13559 次 57 | 58 | * 1个TCP长连接(127.0.0.1)与服务端来回发送(PingPong) 32KB 数据,每秒可以达 9723 次,单向载荷传输速度可以达 2424 Mbit/s 59 | 60 | * 1个TCP长连接(127.0.0.1)发送 512MB 数据到服务端,耗时 1111 毫秒,单向载荷传输速度可以达 3686 Mbit/s 61 | 62 | ## 模块介绍 63 | 64 | * JQNetworkFoundation 65 | 66 | 基础库 67 | 68 | * JQNetworkPackage 69 | 70 | 数据包 71 | 72 | * JQNetworkConnect 73 | 74 | 连接对象 75 | 76 | * JQNetworkConnectPool 77 | 78 | 连接池 79 | 80 | * JQNetworkServer 81 | 82 | 服务端 83 | 84 | * JQNetworkProcessor 85 | 86 | 服务端处理器(处理数据) 87 | 88 | * JQNetworkClient 89 | 90 | 客户端 91 | 92 | * JQNetworkLan 93 | 94 | 局域网功能 -------------------------------------------------------------------------------- /builder/JQNetworkLibBuilder/JQNetworkLibBuilder.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core 14 | 15 | TEMPLATE = lib 16 | 17 | CONFIG += staticlib 18 | 19 | CONFIG( debug, debug | release ) { 20 | TARGET = JQNetworkd 21 | } 22 | 23 | CONFIG( release, debug | release ) { 24 | TARGET = JQNetwork 25 | } 26 | 27 | JQNETWORK_COMPILE_MODE = SRC 28 | include( $$PWD/../../sharedlibrary/JQNetwork/JQNetwork.pri ) 29 | 30 | DESTDIR = $$JQNETWORK_BIN_DIR 31 | -------------------------------------------------------------------------------- /builder/builder.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | TEMPLATE = subdirs 14 | 15 | SUBDIRS += JQNetworkLibBuilder 16 | -------------------------------------------------------------------------------- /demos/FileTransferDemo/FileTransferClientDemo/FileTransferClientDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | HEADERS += 21 | 22 | SOURCES += \ 23 | $$PWD/cpp/main.cpp 24 | -------------------------------------------------------------------------------- /demos/FileTransferDemo/FileTransferClientDemo/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | // JQNetwork lib improt 8 | #include 9 | 10 | int main(int argc, char *argv[]) 11 | { 12 | QCoreApplication a(argc, argv); 13 | JQNetwork::printVersionInformation(); 14 | 15 | // 创建客户端 16 | auto client = JQNetworkClient::createClient( true ); 17 | 18 | // 初始化客户端 19 | if ( !client->begin() ) 20 | { 21 | qDebug() << "Client: begin fail"; 22 | return -1; 23 | } 24 | qDebug() << "Client: begin succeed"; 25 | 26 | // 以阻塞方式创建连接 27 | qDebug() << "Client: waitForCreateConnect:" << client->waitForCreateConnect( "127.0.0.1", 26432 ); 28 | 29 | // 创建一个测试文件 30 | const auto &&sourceFilePath = QString( "%1/%2" ).arg( 31 | QStandardPaths::writableLocation( QStandardPaths::TempLocation ), 32 | "jqnetwork_filetransferdemo" 33 | ); 34 | { 35 | QFile file( sourceFilePath ); 36 | file.open( QIODevice::WriteOnly ); 37 | file.write( QByteArray( "FileTransferDemo" ) ); 38 | file.waitForBytesWritten( 30 * 1000 ); 39 | } 40 | 41 | // 发送文件 42 | qDebug() << "Client: sendFileData reply:" << client->sendFileData( 43 | "127.0.0.1", // 服务端的IP地址 44 | 26432, // 服务端的端口 45 | "fileTransfer", // 需要调用的服务端方法名称 46 | QFileInfo( sourceFilePath ), // 需要发送的文件 47 | [ ](const auto &, const auto &) 48 | { 49 | qDebug() << "Client: send file succeed"; 50 | }, 51 | [ ](const auto &) 52 | { 53 | qDebug() << "Client: send file fail"; 54 | } 55 | ); 56 | 57 | return a.exec(); 58 | } 59 | -------------------------------------------------------------------------------- /demos/FileTransferDemo/FileTransferDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | TEMPLATE = subdirs 14 | 15 | SUBDIRS += FileTransferServerDemo 16 | SUBDIRS += FileTransferClientDemo 17 | -------------------------------------------------------------------------------- /demos/FileTransferDemo/FileTransferServerDemo/FileTransferServerDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | HEADERS += \ 21 | $$PWD/cpp/myserver.hpp 22 | 23 | SOURCES += \ 24 | $$PWD/cpp/main.cpp 25 | -------------------------------------------------------------------------------- /demos/FileTransferDemo/FileTransferServerDemo/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | 4 | // Project lib import 5 | #include "myserver.hpp" 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | QCoreApplication a(argc, argv); 10 | JQNetwork::printVersionInformation(); 11 | 12 | MyServer myServer; 13 | if ( !myServer.begin() ) { return -1; } 14 | 15 | return a.exec(); 16 | } 17 | -------------------------------------------------------------------------------- /demos/FileTransferDemo/FileTransferServerDemo/cpp/myserver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef __CPP_MYSERVER_HPP__ 2 | #define __CPP_MYSERVER_HPP__ 3 | 4 | // Qt lib import 5 | #include 6 | #include 7 | #include 8 | 9 | // JQNetwork lib improt 10 | #include 11 | 12 | class MyServer: public JQNetworkProcessor 13 | { 14 | Q_OBJECT 15 | Q_DISABLE_COPY( MyServer ) 16 | 17 | public: 18 | MyServer() = default; 19 | 20 | ~MyServer() = default; 21 | 22 | bool begin() 23 | { 24 | // 创建一个服务端 25 | server_ = JQNetworkServer::createServer( 26432, QHostAddress::Any, true ); 26 | 27 | // 注册当前类 28 | server_->registerProcessor( this ); 29 | 30 | // 设置文件保存到桌面 31 | server_->connectSettings()->setFilePathProviderToDir( QStandardPaths::writableLocation( QStandardPaths::DesktopLocation ) ); 32 | 33 | // 初始化服务端 34 | if ( !server_->begin() ) 35 | { 36 | qDebug() << "MyServer: begin fail"; 37 | return false; 38 | } 39 | 40 | qDebug() << "MyServer: begin succeed"; 41 | 42 | return true; 43 | } 44 | 45 | // 用于处理的函数必须是槽函数 46 | public slots: 47 | void fileTransfer(const QFileInfo &received, QVariantMap &send) 48 | { 49 | // 回调会发生在一个专用的线程,请注意线程安全 50 | 51 | // 打印接收到的文件 52 | qDebug() << "fileTransfer received:" << received.filePath(); 53 | 54 | // 返回数据 55 | send[ "succeed" ] = true; 56 | send[ "message" ] = ""; 57 | } 58 | 59 | private: 60 | JQNetworkServerSharedPointer server_; 61 | }; 62 | 63 | #endif//__CPP_MYSERVER_HPP__ 64 | -------------------------------------------------------------------------------- /demos/LanNodeSearchDemo/LanNodeSearchDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core testlib 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | HEADERS += 21 | 22 | SOURCES += \ 23 | $$PWD/cpp/main.cpp 24 | -------------------------------------------------------------------------------- /demos/LanNodeSearchDemo/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | 4 | // JQNetwork lib improt 5 | #include 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | QCoreApplication a(argc, argv); 10 | JQNetwork::printVersionInformation(); 11 | 12 | std::function< void() > printLanNodeList; 13 | 14 | // 创建配置 15 | JQNetworkLanSettingsSharedPointer lanSettings( new JQNetworkLanSettings ); 16 | lanSettings->multicastGroupAddress = QHostAddress( "228.12.23.34" ); // 组播地址 17 | lanSettings->bindPort = 12345; // 绑定端口 18 | 19 | lanSettings->lanNodeListChangedCallback = [ &printLanNodeList ]() // 当节点列表发生改变时的回调 20 | { 21 | printLanNodeList(); 22 | }; 23 | 24 | // 根据配置创建一个局域网模块 25 | JQNetworkLan lan( lanSettings ); 26 | 27 | // 给列表打印回调赋值,以供使用 28 | printLanNodeList = [ &lan ]() 29 | { 30 | qDebug() << "\n----- Lan node list start -----"; 31 | 32 | for ( const auto &lanNode: lan.availableLanNodes() ) 33 | { 34 | qDebug() << "lanNode: matchAddress" << lanNode.matchAddress.toString() << ", isSelf:" << lanNode.isSelf << ", nodeMarkSummary:" << lanNode.nodeMarkSummary; 35 | } 36 | 37 | qDebug() << "----- Lan node list end -----"; 38 | }; 39 | 40 | // 初始化局域网模块 41 | const auto &&beginSucceed = lan.begin(); 42 | qDebug() << "lan begin succeed:" << beginSucceed; 43 | if ( !beginSucceed ) { return -1; } 44 | 45 | return a.exec(); 46 | } 47 | -------------------------------------------------------------------------------- /demos/PingPongDemo/PingDemo/PingDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | HEADERS += \ 21 | $$PWD/cpp/ping.hpp 22 | 23 | SOURCES += \ 24 | $$PWD/cpp/main.cpp 25 | -------------------------------------------------------------------------------- /demos/PingPongDemo/PingDemo/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | 4 | // Project lib import 5 | #include "ping.hpp" 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | QCoreApplication a(argc, argv); 10 | JQNetwork::printVersionInformation(); 11 | 12 | Ping ping; 13 | if ( !ping.begin() ) { return -1; } 14 | 15 | return a.exec(); 16 | } 17 | -------------------------------------------------------------------------------- /demos/PingPongDemo/PingDemo/cpp/ping.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CPP_PING_HPP_ 2 | #define CPP_PING_HPP_ 3 | 4 | // Qt lib import 5 | #include 6 | #include 7 | #include 8 | 9 | // JQNetwork lib improt 10 | #include 11 | 12 | // Ping 为客户端 13 | class Ping 14 | { 15 | public: 16 | Ping() = default; 17 | 18 | ~Ping() = default; 19 | 20 | bool begin() 21 | { 22 | // 创建一个客户端 23 | client_ = JQNetworkClient::createClient(); 24 | 25 | client_->clientSettings()->connectToHostErrorCallback = std::bind( &Ping::connectToHostErrorCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ); 26 | client_->clientSettings()->connectToHostTimeoutCallback = std::bind( &Ping::connectToHostTimeoutCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ); 27 | client_->clientSettings()->connectToHostSucceedCallback = std::bind( &Ping::onConnectSucceed, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ); 28 | 29 | if ( !client_->begin() ) 30 | { 31 | qDebug() << "Ping: begin fail"; 32 | return false; 33 | } 34 | 35 | // 预创建一个连接,指向某个服务端,并保持长连接,不创建也可以 36 | client_->createConnect( "127.0.0.1", 34543 ); 37 | 38 | // 设置定时器,定时发送数据 39 | timer_.setInterval( 1000 ); 40 | timer_.setSingleShot( true ); 41 | QObject::connect( &timer_, &QTimer::timeout, std::bind( &Ping::ping, this ) ); 42 | 43 | qDebug() << "Ping: begin succeed"; 44 | 45 | timer_.start(); 46 | 47 | return true; 48 | } 49 | 50 | // 连接到服务端超时后的回调 51 | void connectToHostErrorCallback(const JQNetworkConnectPointer & /*connect*/, const QString &hostName, const quint16 &port) 52 | { 53 | // 回调会发生在一个专用的线程,请注意线程安全 54 | 55 | // 打印谁被连接成功了 56 | qDebug() << "Client: connect to server error:" << hostName << port; 57 | } 58 | 59 | // 连接到服务端错误后的回调 60 | void connectToHostTimeoutCallback(const JQNetworkConnectPointer & /*connect*/, const QString &hostName, const quint16 &port) 61 | { 62 | // 回调会发生在一个专用的线程,请注意线程安全 63 | 64 | // 打印谁被连接成功了 65 | qDebug() << "Client: connect to server timeout:" << hostName << port; 66 | } 67 | 68 | // 连接到服务端后的回调 69 | void onConnectSucceed(const JQNetworkConnectPointer & /*connect*/, const QString &hostName, const quint16 &port) 70 | { 71 | // 回调会发生在一个专用的线程,请注意线程安全 72 | 73 | // 打印谁被连接成功了 74 | qDebug() << "Client: connect to server succeed:" << hostName << port; 75 | } 76 | 77 | // Ping 测试 78 | void ping() 79 | { 80 | ++pingCount_; 81 | 82 | // 发送数据前会自动检查连接,如果有则使用已经有的链接,没有则创建一个新的(以阻塞方式创建) 83 | const auto &&randomFlag = client_->sendPayloadData( // 发送数据,返回0表示失败,其余数表示发送成功 84 | "127.0.0.1", // 服务端IP 85 | 34543, // 服务端端口 86 | "pong", 87 | QJsonDocument( QJsonObject::fromVariantMap( QVariantMap( { { "ping", "ping" } } ) ) ).toJson( QJsonDocument::Compact ), 88 | std::bind( &Ping::onPingSucceed, this, std::placeholders::_1, std::placeholders::_2 ), 89 | std::bind( &Ping::onPingFail, this, std::placeholders::_1 ) 90 | ); 91 | 92 | if ( !randomFlag ) 93 | { 94 | // 发送失败 95 | 96 | qDebug() << "Ping: send fail"; 97 | } 98 | else 99 | { 100 | // 发送成功 101 | 102 | qDebug() << "Ping: send succeed, randomFlag:" << randomFlag; 103 | ++sendSucceedCount_; 104 | } 105 | } 106 | 107 | // 发送成,并且成功接收回复的数据时的回调 108 | void onPingSucceed(const JQNetworkConnectPointer & /*connect*/, const JQNetworkPackageSharedPointer &package) 109 | { 110 | // 回调会发生在一个专用的线程,请注意线程安全 111 | 112 | // 打印服务端回复的数据 113 | qDebug() << "Ping: ping reply:" << package->payloadData() << ", randomFlag:" << package->randomFlag(); 114 | 115 | ++replySucceedCount_; 116 | 117 | qDebug() << "TotalCount: " 118 | << "pingCount:" << this->pingCount_ 119 | << ", sendSucceedCount:" << this->sendSucceedCount_ 120 | << ", replySucceedCount:" << replySucceedCount_ << "\n"; 121 | 122 | if ( !( replySucceedCount_ % 100000 ) ) 123 | { 124 | // 到达特定数量后,退出发送循环 125 | return; 126 | } 127 | 128 | // 循环发送 129 | // 因为这里在一个新的线程,所以通过 invokeMethod 去调用 start 130 | QMetaObject::invokeMethod( &timer_, "start" ); 131 | } 132 | 133 | // 发送成功,但是未能成功接收回复的数据时的回调 134 | void onPingFail(const JQNetworkConnectPointer & /*connect*/) 135 | { 136 | // 回调会发生在一个专用的线程,请注意线程安全 137 | 138 | qDebug() << "Ping: ping fail"; 139 | 140 | // 循环发送 141 | // 因为这里在一个新的线程,所以通过 invokeMethod 去调用 start 142 | QMetaObject::invokeMethod( &timer_, "start" ); 143 | } 144 | 145 | private: 146 | JQNetworkClientSharedPointer client_; 147 | 148 | // 计数器 149 | int pingCount_ = 0; 150 | int sendSucceedCount_ = 0; 151 | int replySucceedCount_ = 0; 152 | 153 | // 定时器,循环发送用 154 | QTimer timer_; 155 | }; 156 | 157 | #endif//CPP_PING_HPP_ 158 | -------------------------------------------------------------------------------- /demos/PingPongDemo/PingPongDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | TEMPLATE = subdirs 14 | 15 | SUBDIRS += PongDemo 16 | SUBDIRS += PingDemo 17 | -------------------------------------------------------------------------------- /demos/PingPongDemo/PongDemo/PongDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | HEADERS += \ 21 | $$PWD/cpp/pong.hpp 22 | 23 | SOURCES += \ 24 | $$PWD/cpp/main.cpp 25 | -------------------------------------------------------------------------------- /demos/PingPongDemo/PongDemo/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | 4 | // Project lib import 5 | #include "pong.hpp" 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | QCoreApplication a(argc, argv); 10 | JQNetwork::printVersionInformation(); 11 | 12 | Pong pong; 13 | if ( !pong.begin() ) { return -1; } 14 | 15 | return a.exec(); 16 | } 17 | -------------------------------------------------------------------------------- /demos/PingPongDemo/PongDemo/cpp/pong.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CPP_PONG_HPP_ 2 | #define CPP_PONG_HPP_ 3 | 4 | // JQNetwork lib improt 5 | #include 6 | 7 | // Pong 为服务端 8 | class Pong: public JQNetworkProcessor 9 | { 10 | Q_OBJECT 11 | 12 | public: 13 | Pong() = default; 14 | 15 | ~Pong() = default; 16 | 17 | bool begin() 18 | { 19 | // 创建一个服务端 20 | const quint16 &&listenPort = 34543; // 监听端口 21 | server_ = JQNetworkServer::createServer( listenPort ); 22 | 23 | // 注册当前类 24 | server_->registerProcessor( this ); 25 | 26 | // 初始化服务端 27 | if ( !server_->begin() ) 28 | { 29 | qDebug() << "Pong: begin fail"; 30 | return false; 31 | } 32 | 33 | qDebug() << "Pong: begin succeed"; 34 | 35 | return true; 36 | } 37 | 38 | // 用于处理的函数必须是槽函数 39 | public slots: 40 | void pong(const QVariantMap &received, QVariantMap &send) 41 | { 42 | // 回调会发生在一个专用的线程,请注意线程安全 43 | 44 | // 打印客户端发送的数据 45 | qDebug() << "Pong: received data:" << received; 46 | 47 | // 返回一个数据,需要指定 randomFlag 以告知客户端 48 | send[ "pong" ] = "pong"; 49 | } 50 | 51 | private: 52 | JQNetworkServerSharedPointer server_; 53 | }; 54 | 55 | #endif//CPP_PONG_HPP_ 56 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginClientDemo/UserLoginClientDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core qml quick 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | SOURCES += \ 21 | $$PWD/cpp/main.cpp 22 | 23 | RESOURCES += \ 24 | $$PWD/qml/qml.qrc 25 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginClientDemo/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | #include 4 | 5 | // JQNetwork lib improt 6 | #include 7 | 8 | int main(int argc, char *argv[]) 9 | { 10 | QGuiApplication app(argc, argv); 11 | JQNetwork::printVersionInformation(); 12 | 13 | QQmlApplicationEngine engine; 14 | 15 | JQNETWORKCLIENTFORQML_REGISTERTYPE( engine ); 16 | 17 | engine.load( QUrl( QStringLiteral( "qrc:/main.qml" ) ) ); 18 | 19 | return app.exec(); 20 | } 21 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginClientDemo/qml/main.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.7 2 | import QtQuick.Controls 2.1 3 | import QtQuick.Window 2.2 4 | import JQNetwork 1.0 5 | 6 | Window { 7 | visible: true 8 | width: 320 9 | height: 480 10 | title: "LoginDemo" 11 | 12 | JQNetworkClient { 13 | id: networkClient 14 | 15 | onConnectToHostError: { 16 | print( "onConnectToHostError:", hostName, port ); 17 | 18 | textForMessage.text = "ConnectToHostError"; 19 | } 20 | 21 | onConnectToHostTimeout: { 22 | print( "onConnectToHostTimeout:", hostName, port ); 23 | 24 | textForMessage.text = "ConnectToHostTimeout"; 25 | } 26 | 27 | onConnectToHostSucceed: { 28 | print( "onConnectToHostSucceed:", hostName, port ); 29 | 30 | textForMessage.text = "ConnectToHostSucceed"; 31 | } 32 | 33 | Component.onCompleted: { 34 | var beginClientSucceed = networkClient.beginClient(); 35 | print( "JQNetworkClientForQml::beginClient:", beginClientSucceed ); 36 | 37 | if ( !beginClientSucceed ) { return; } 38 | 39 | // 预创建一个连接,指向某个服务端,并保持长连接,不创建也可以 40 | networkClient.createConnect( "127.0.0.1", 23456 ); 41 | } 42 | } 43 | 44 | TextEdit { 45 | id: textEditForUsername 46 | text: "Username" 47 | verticalAlignment: Text.AlignVCenter 48 | anchors.horizontalCenter: parent.horizontalCenter 49 | anchors.verticalCenter: parent.verticalCenter 50 | anchors.verticalCenterOffset: -75 51 | 52 | Rectangle { 53 | anchors.fill: parent 54 | anchors.margins: -10 55 | color: "transparent" 56 | border.width: 1 57 | } 58 | 59 | Text { 60 | anchors.right: parent.left 61 | anchors.rightMargin: 20 62 | anchors.verticalCenter: parent.verticalCenter 63 | text: "Username:" 64 | } 65 | } 66 | 67 | TextEdit { 68 | id: textEditForPassword 69 | text: "123456" 70 | verticalAlignment: Text.AlignVCenter 71 | anchors.horizontalCenter: parent.horizontalCenter 72 | anchors.verticalCenter: parent.verticalCenter 73 | anchors.verticalCenterOffset: 0 74 | 75 | Rectangle { 76 | anchors.fill: parent 77 | anchors.margins: -10 78 | color: "transparent" 79 | border.width: 1 80 | } 81 | 82 | Text { 83 | anchors.right: parent.left 84 | anchors.rightMargin: 20 85 | anchors.verticalCenter: parent.verticalCenter 86 | text: "Password:" 87 | } 88 | } 89 | 90 | Button { 91 | text: "Login" 92 | anchors.horizontalCenter: parent.horizontalCenter 93 | anchors.verticalCenter: parent.verticalCenter 94 | anchors.verticalCenterOffset: 75 95 | 96 | onClicked: { 97 | // 发送数据前会自动检查连接,如果有则使用已经有的链接,没有则创建一个新的(以阻塞方式创建) 98 | networkClient.sendVariantMapData( 99 | "127.0.0.1", // 服务端的IP地址 100 | 23456, // 服务端的端口 101 | "userLogin", // 需要调用的服务端方法名称 102 | { // \ 103 | username: textEditForUsername.text, // |--> 传给服务端的参数 104 | password: textEditForPassword.text // | 105 | }, // / 106 | onLoginSucceed, // 当请求执行成功时的回调,这里可以接受匿名回调作为参数 107 | onLoginFail // 当请求执行失败时的回调,这里可以接受匿名回调作为参数 108 | ); 109 | } 110 | 111 | // 请求成功,也就是传输的数据已经到达服务端,会调用这个回调 112 | function onLoginSucceed(received) { 113 | if ( received[ "succeed" ] ) 114 | { 115 | textForMessage.text = "LoginSucceed"; 116 | } 117 | else 118 | { 119 | textForMessage.text = "LoginFail: Message" + received[ "message" ]; 120 | } 121 | } 122 | 123 | // 请求失败,也就是传输的数据未到达幅度按,会调用这个回调 124 | function onLoginFail() { 125 | textForMessage.text = "LoginFail"; 126 | } 127 | } 128 | 129 | Text { 130 | id: textForMessage 131 | anchors.horizontalCenter: parent.horizontalCenter 132 | anchors.bottom: parent.bottom 133 | anchors.bottomMargin: 50 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginClientDemo/qml/qml.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | main.qml 4 | 5 | 6 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | TEMPLATE = subdirs 14 | 15 | SUBDIRS += UserLoginServerDemo 16 | SUBDIRS += UserLoginClientDemo 17 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginServerDemo/UserLoginServerDemo.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | HEADERS += \ 21 | $$PWD/cpp/myserver.hpp 22 | 23 | SOURCES += \ 24 | $$PWD/cpp/main.cpp 25 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginServerDemo/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | 4 | // Project lib import 5 | #include "myserver.hpp" 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | QCoreApplication a(argc, argv); 10 | JQNetwork::printVersionInformation(); 11 | 12 | MyServer myServer; 13 | if ( !myServer.begin() ) { return -1; } 14 | 15 | return a.exec(); 16 | } 17 | -------------------------------------------------------------------------------- /demos/UserLoginDemo/UserLoginServerDemo/cpp/myserver.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CPP_MYSERVER_HPP_ 2 | #define CPP_MYSERVER_HPP_ 3 | 4 | // Qt lib import 5 | #include 6 | 7 | // JQNetwork lib improt 8 | #include 9 | 10 | class MyServer: public JQNetworkProcessor 11 | { 12 | Q_OBJECT 13 | Q_DISABLE_COPY( MyServer ) 14 | 15 | public: 16 | MyServer() = default; 17 | 18 | ~MyServer() = default; 19 | 20 | bool begin() 21 | { 22 | // 创建一个服务端 23 | const quint16 &&listenPort = 23456; // 监听端口 24 | server_ = JQNetworkServer::createServer( listenPort ); 25 | 26 | // 注册当前类 27 | server_->registerProcessor( this ); 28 | 29 | // 初始化服务端 30 | if ( !server_->begin() ) 31 | { 32 | qDebug() << "MyServer: begin fail"; 33 | return false; 34 | } 35 | 36 | qDebug() << "MyServer: begin succeed"; 37 | 38 | return true; 39 | } 40 | 41 | // 用于处理的函数必须是槽函数 42 | public slots: 43 | void userLogin(const QVariantMap &received, QVariantMap &send) 44 | { 45 | // 回调会发生在一个专用的线程,请注意线程安全 46 | 47 | // 打印客户端发送的数据 48 | qDebug() << "MyServer::userLogin: received data:" << received; 49 | 50 | if ( !received.contains( "username" ) || received[ "username" ].toString().isEmpty() ) 51 | { 52 | send[ "succeed" ] = false; 53 | send[ "message" ] = "username is empty"; 54 | return; 55 | } 56 | 57 | if ( !received.contains( "password" ) || received[ "password" ].toString().isEmpty() ) 58 | { 59 | send[ "succeed" ] = false; 60 | send[ "message" ] = "password is empty"; 61 | return; 62 | } 63 | 64 | // 返回数据 65 | send[ "succeed" ] = true; 66 | send[ "message" ] = ""; 67 | } 68 | 69 | private: 70 | JQNetworkServerSharedPointer server_; 71 | }; 72 | 73 | #endif//CPP_MYSERVER_HPP_ 74 | -------------------------------------------------------------------------------- /demos/demos.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | TEMPLATE = subdirs 14 | 15 | SUBDIRS += PingPongDemo 16 | SUBDIRS += FileTransferDemo 17 | SUBDIRS += LanNodeSearchDemo 18 | SUBDIRS += UserLoginDemo 19 | -------------------------------------------------------------------------------- /doc/MindNode/处理器.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/处理器.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/处理器.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/处理器.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/处理器.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/处理器.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/处理器.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/处理器.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/客户端.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/客户端.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/客户端.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/客户端.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/客户端.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/客户端.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/客户端.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/客户端.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/数据包结构.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/数据包结构.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/数据包结构.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/数据包结构.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/数据包结构.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/数据包结构.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/数据包结构.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/数据包结构.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/服务端.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/服务端.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/服务端.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/服务端.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/服务端.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/服务端.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/服务端.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/服务端.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/职责映射.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/职责映射.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/职责映射.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/职责映射.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/职责映射.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/职责映射.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/职责映射.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/职责映射.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/节点标记.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点标记.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/节点标记.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点标记.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/节点标记.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点标记.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/节点标记.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点标记.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/节点配置.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点配置.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/节点配置.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点配置.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/节点配置.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点配置.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/节点配置.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/节点配置.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/转发节点.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/转发节点.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/转发节点.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/转发节点.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/转发节点.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/转发节点.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/转发节点.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/转发节点.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/连接池.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接池.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/连接池.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接池.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/连接池.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接池.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/连接池.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接池.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/连接节点.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接节点.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/连接节点.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接节点.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/连接节点.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接节点.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/连接节点.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/连接节点.mindnode/viewState.plist -------------------------------------------------------------------------------- /doc/MindNode/通讯流程.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/通讯流程.mindnode/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/通讯流程.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/通讯流程.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /doc/MindNode/通讯流程.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/通讯流程.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /doc/MindNode/通讯流程.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/188080501/JQNetwork/4810698af00eed7a08bf612800c6d4306213343e/doc/MindNode/通讯流程.mindnode/viewState.plist -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/JQNetwork.pri: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT *= core network concurrent 14 | 15 | CONFIG *= c++11 16 | CONFIG *= c++14 17 | 18 | INCLUDEPATH *= \ 19 | $$PWD/include/ 20 | 21 | # 定义JQNetwork的版本 22 | JQNETWORK_VERSIONSTRING = 0.6.6 23 | 24 | # 判断Qt版本,小于5.7就报错 25 | lessThan( QT_MAJOR_VERSION, 5 ) | lessThan( QT_MINOR_VERSION, 7 ) { 26 | error( JQNetwork request minimum Qt version is 5.7.0 ) 27 | } 28 | 29 | # 准备bin库目录 30 | JQNETWORK_BIN_NO1_DIR = JQNetwork$$JQNETWORK_VERSIONSTRING/Qt$$[QT_VERSION] 31 | JQNETWORK_BIN_NO2_DIR = $$QT_ARCH 32 | JQNETWORK_BIN_NO3_DIR = $$[QMAKE_XSPEC] 33 | JQNETWORK_BIN_NO3_DIR ~= s/g\+\+/gcc 34 | 35 | # 根据编译参数,追加static名称 36 | contains( CONFIG, static ) { 37 | JQNETWORK_BIN_NO3_DIR = $$JQNETWORK_BIN_NO3_DIR-static 38 | } 39 | 40 | JQNETWORK_BIN_DIR = $$PWD/bin/$$JQNETWORK_BIN_NO1_DIR/$$JQNETWORK_BIN_NO2_DIR/$$JQNETWORK_BIN_NO3_DIR 41 | #message($$JQNETWORK_BIN_DIR) 42 | 43 | # 若bin目录不存在则创建 44 | !exists( $$JQNETWORK_BIN_DIR ) { 45 | mkpath( $$JQNETWORK_BIN_DIR ) 46 | } 47 | 48 | # 根据不同系统,选择合适的名字 49 | unix | linux | mingw { 50 | CONFIG( debug, debug | release ) { 51 | JQNETWORK_LIB_FILENAME = libJQNetworkd.a 52 | } 53 | CONFIG( release, debug | release ) { 54 | JQNETWORK_LIB_FILENAME = libJQNetwork.a 55 | } 56 | } 57 | else: msvc { 58 | CONFIG( debug, debug | release ) { 59 | JQNETWORK_LIB_FILENAME = JQNetworkd.lib 60 | } 61 | CONFIG( release, debug | release ) { 62 | JQNETWORK_LIB_FILENAME = JQNetwork.lib 63 | } 64 | } 65 | else { 66 | error( unknow platfrom ) 67 | } 68 | 69 | # 生成bin路径 70 | JQNETWORK_LIB_FILEPATH = $$JQNETWORK_BIN_DIR/$$JQNETWORK_LIB_FILENAME 71 | 72 | # 如果未指定编译模式,并且本地存在bin文件,那么使用bin文件 73 | !equals(JQNETWORK_COMPILE_MODE, SRC) { 74 | exists($$JQNETWORK_LIB_FILEPATH) { 75 | JQNETWORK_COMPILE_MODE = LIB 76 | } 77 | else { 78 | JQNETWORK_COMPILE_MODE = SRC 79 | } 80 | } 81 | 82 | equals(JQNETWORK_COMPILE_MODE,SRC) { 83 | 84 | HEADERS *= \ 85 | $$PWD/include/jqnetwork_foundation.h \ 86 | $$PWD/include/jqnetwork_foundation.inc \ 87 | $$PWD/include/jqnetwork_package.h \ 88 | $$PWD/include/jqnetwork_package.inc \ 89 | $$PWD/include/jqnetwork_connect.h \ 90 | $$PWD/include/jqnetwork_connect.inc \ 91 | $$PWD/include/jqnetwork_connectpool.h \ 92 | $$PWD/include/jqnetwork_connectpool.inc \ 93 | $$PWD/include/jqnetwork_server.h \ 94 | $$PWD/include/jqnetwork_server.inc \ 95 | $$PWD/include/jqnetwork_processor.h \ 96 | $$PWD/include/jqnetwork_processor.inc \ 97 | $$PWD/include/jqnetwork_client.h \ 98 | $$PWD/include/jqnetwork_client.inc \ 99 | $$PWD/include/jqnetwork_lan.h \ 100 | $$PWD/include/jqnetwork_lan.inc 101 | 102 | SOURCES *= \ 103 | $$PWD/src/jqnetwork_foundation.cpp \ 104 | $$PWD/src/jqnetwork_package.cpp \ 105 | $$PWD/src/jqnetwork_connect.cpp \ 106 | $$PWD/src/jqnetwork_connectpool.cpp \ 107 | $$PWD/src/jqnetwork_server.cpp \ 108 | $$PWD/src/jqnetwork_processor.cpp \ 109 | $$PWD/src/jqnetwork_client.cpp \ 110 | $$PWD/src/jqnetwork_lan.cpp 111 | 112 | } 113 | else : equals(JQNETWORK_COMPILE_MODE,LIB) { 114 | 115 | LIBS *= $$JQNETWORK_LIB_FILEPATH 116 | } 117 | else { 118 | error(unknow JQNETWORK_COMPILE_MODE: $$JQNETWORK_COMPILE_MODE) 119 | } 120 | 121 | # 如果开启了qml模块,那么引入JQNetwork的qml扩展部分 122 | contains( QT, qml ) { 123 | 124 | HEADERS *= \ 125 | $$PWD/include/jqnetwork_clientforqml.h \ 126 | $$PWD/include/jqnetwork_clientforqml.inc 127 | 128 | SOURCES *= \ 129 | $$PWD/src/jqnetwork_clientforqml.cpp 130 | 131 | RESOURCES *= \ 132 | $$PWD/qml/JQNetworkQml.qrc 133 | 134 | QML_IMPORT_PATH *= \ 135 | $$PWD/qml/ 136 | } 137 | 138 | DEFINES *= JQNETWORK_COMPILE_MODE_STRING=\\\"$$JQNETWORK_COMPILE_MODE\\\" 139 | DEFINES *= JQNETWORK_VERSIONSTRING=\\\"$$JQNETWORK_VERSIONSTRING\\\" 140 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetwork: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | 22 | #ifdef QT_QML_LIB 23 | # include 24 | #endif 25 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkClient: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_client.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkClientForQml: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_clientforqml.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkConnect: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_connect.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkConnectPool: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_connectpool.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkEncrypt: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_encrypt.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkFoundation: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_foundation.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkLan: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_lan.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkPackage: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_package.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkProcessor: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_processor.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/JQNetworkServer: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_server.h" 14 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_client.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_CLIENG_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_CLIENG_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_client.h" 18 | 19 | inline JQNetworkClientSettingsSharedPointer JQNetworkClient::clientSettings() 20 | { 21 | return clientSettings_; 22 | } 23 | 24 | inline JQNetworkConnectPoolSettingsSharedPointer JQNetworkClient::connectPoolSettings() 25 | { 26 | return connectPoolSettings_; 27 | } 28 | 29 | inline JQNetworkConnectSettingsSharedPointer JQNetworkClient::connectSettings() 30 | { 31 | return connectSettings_; 32 | } 33 | 34 | inline QString JQNetworkClient::nodeMarkSummary() const 35 | { 36 | return nodeMarkSummary_; 37 | } 38 | 39 | inline QSet< QString > JQNetworkClient::availableProcessorMethodNames() const 40 | { 41 | return QSet< QString >::fromList( processorCallbacks_.keys() ); 42 | } 43 | 44 | inline qint32 JQNetworkClient::sendPayloadData( 45 | const QString &hostName, 46 | const quint16 &port, 47 | const QString &targetActionFlag, 48 | const QByteArray &payloadData, 49 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 50 | const JQNetworkConnectPointerFunction &failCallback 51 | ) 52 | { 53 | return this->sendPayloadData( 54 | hostName, 55 | port, 56 | targetActionFlag, 57 | payloadData, 58 | { }, // empty appendData 59 | succeedCallback, 60 | failCallback 61 | ); 62 | } 63 | 64 | inline qint32 JQNetworkClient::sendPayloadData( 65 | const QString &hostName, 66 | const quint16 &port, 67 | const QByteArray &payloadData, 68 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 69 | const JQNetworkConnectPointerFunction &failCallback 70 | ) 71 | { 72 | return this->sendPayloadData( 73 | hostName, 74 | port, 75 | { }, // empty targetActionFlag 76 | payloadData, 77 | { }, // empty appendData 78 | succeedCallback, 79 | failCallback 80 | ); 81 | } 82 | 83 | inline qint32 JQNetworkClient::sendVariantMapData( 84 | const QString &hostName, 85 | const quint16 &port, 86 | const QString &targetActionFlag, 87 | const QVariantMap &variantMap, 88 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 89 | const JQNetworkConnectPointerFunction &failCallback 90 | ) 91 | { 92 | return this->sendVariantMapData( 93 | hostName, 94 | port, 95 | targetActionFlag, 96 | variantMap, 97 | { }, // empty appendData 98 | succeedCallback, 99 | failCallback 100 | ); 101 | } 102 | 103 | inline qint32 JQNetworkClient::sendVariantMapData( 104 | const QString &hostName, 105 | const quint16 &port, 106 | const QVariantMap &variantMap, 107 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 108 | const JQNetworkConnectPointerFunction &failCallback 109 | ) 110 | { 111 | return this->sendVariantMapData( 112 | hostName, 113 | port, 114 | { }, // empty targetActionFlag 115 | variantMap, 116 | { }, // empty appendData 117 | succeedCallback, 118 | failCallback 119 | ); 120 | } 121 | 122 | inline qint32 JQNetworkClient::sendFileData( 123 | const QString &hostName, 124 | const quint16 &port, 125 | const QString &targetActionFlag, 126 | const QFileInfo &fileInfo, 127 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 128 | const JQNetworkConnectPointerFunction &failCallback 129 | ) 130 | { 131 | return this->sendFileData( 132 | hostName, 133 | port, 134 | targetActionFlag, 135 | fileInfo, 136 | { }, // empty appendData 137 | succeedCallback, 138 | failCallback 139 | ); 140 | } 141 | 142 | inline qint32 JQNetworkClient::sendFileData( 143 | const QString &hostName, 144 | const quint16 &port, 145 | const QFileInfo &fileInfo, 146 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 147 | const JQNetworkConnectPointerFunction &failCallback 148 | ) 149 | { 150 | return this->sendFileData( 151 | hostName, 152 | port, 153 | { }, // empty targetActionFlag 154 | fileInfo, 155 | { }, // empty appendData 156 | succeedCallback, 157 | failCallback 158 | ); 159 | } 160 | 161 | inline qint32 JQNetworkClient::waitForSendPayloadData( 162 | const QString &hostName, 163 | const quint16 &port, 164 | const QString &targetActionFlag, 165 | const QByteArray &payloadData, 166 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 167 | const JQNetworkConnectPointerFunction &failCallback 168 | ) 169 | { 170 | return this->waitForSendPayloadData( 171 | hostName, 172 | port, 173 | targetActionFlag, 174 | payloadData, 175 | { }, // empty appendData 176 | succeedCallback, 177 | failCallback 178 | ); 179 | } 180 | 181 | inline qint32 JQNetworkClient::waitForSendPayloadData( 182 | const QString &hostName, 183 | const quint16 &port, 184 | const QByteArray &payloadData, 185 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 186 | const JQNetworkConnectPointerFunction &failCallback 187 | ) 188 | { 189 | return this->waitForSendPayloadData( 190 | hostName, 191 | port, 192 | { }, // empty targetActionFlag 193 | payloadData, 194 | { }, // empty appendData 195 | succeedCallback, 196 | failCallback 197 | ); 198 | } 199 | 200 | inline qint32 JQNetworkClient::waitForSendVariantMapData( 201 | const QString &hostName, 202 | const quint16 &port, 203 | const QString &targetActionFlag, 204 | const QVariantMap &variantMap, 205 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 206 | const JQNetworkConnectPointerFunction &failCallback 207 | ) 208 | { 209 | return this->waitForSendVariantMapData( 210 | hostName, 211 | port, 212 | targetActionFlag, 213 | variantMap, 214 | { }, // empty appendData 215 | succeedCallback, 216 | failCallback 217 | ); 218 | } 219 | 220 | inline qint32 JQNetworkClient::waitForSendVariantMapData( 221 | const QString &hostName, 222 | const quint16 &port, 223 | const QVariantMap &variantMap, 224 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 225 | const JQNetworkConnectPointerFunction &failCallback 226 | ) 227 | { 228 | return this->waitForSendVariantMapData( 229 | hostName, 230 | port, 231 | { }, // empty targetActionFlag 232 | variantMap, 233 | { }, // empty appendData 234 | succeedCallback, 235 | failCallback 236 | ); 237 | } 238 | 239 | inline qint32 JQNetworkClient::waitForSendFileData( 240 | const QString &hostName, 241 | const quint16 &port, 242 | const QString &targetActionFlag, 243 | const QFileInfo &fileInfo, 244 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 245 | const JQNetworkConnectPointerFunction &failCallback 246 | ) 247 | { 248 | return this->waitForSendFileData( 249 | hostName, 250 | port, 251 | targetActionFlag, 252 | fileInfo, 253 | { }, // empty appendData 254 | succeedCallback, 255 | failCallback 256 | ); 257 | } 258 | 259 | inline qint32 JQNetworkClient::waitForSendFileData( 260 | const QString &hostName, 261 | const quint16 &port, 262 | const QFileInfo &fileInfo, 263 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 264 | const JQNetworkConnectPointerFunction &failCallback 265 | ) 266 | { 267 | return this->waitForSendFileData( 268 | hostName, 269 | port, 270 | { }, // empty targetActionFlag 271 | fileInfo, 272 | { }, // empty appendData 273 | succeedCallback, 274 | failCallback 275 | ); 276 | } 277 | 278 | #endif//JQNETWORK_INCLUDE_JQNETWORK_CLIENG_INC_ 279 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_clientforqml.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_CLIENGFORQML_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_CLIENGFORQML_H_ 15 | 16 | // Qt lib import 17 | #include 18 | #include 19 | #include 20 | 21 | // JQNetwork lib import 22 | #include 23 | 24 | #ifndef QT_CORE_LIB 25 | # error("Please add qml in pro file") 26 | #endif 27 | 28 | #define JQNETWORKCLIENTFORQML_REGISTERTYPE( engine ) \ 29 | qmlRegisterType< JQNetworkClientForQml >( "JQNetworkClientForQml", 1, 0, "JQNetworkClientForQml" ); \ 30 | engine.addImportPath( ":/JQNetwork/" ); 31 | 32 | class JQNetworkClientForQml: public QObject 33 | { 34 | Q_OBJECT 35 | 36 | public: 37 | JQNetworkClientForQml(); 38 | 39 | ~JQNetworkClientForQml() = default; 40 | 41 | public slots: 42 | bool beginClient(); 43 | 44 | QVariantMap test() { return { { "key", QDateTime::currentDateTime() }, { "key2", QByteArray::fromHex( "00112233" ) } }; } 45 | 46 | void print(const QVariant &d) { qDebug() << d; } 47 | 48 | void createConnect(const QString &hostName, const quint16 &port); 49 | 50 | void sendVariantMapData( 51 | const QString &hostName, 52 | const quint16 &port, 53 | const QString &targetActionFlag, 54 | const QVariantMap &payloadData, 55 | QJSValue succeedCallback, 56 | QJSValue failCallback 57 | ); 58 | 59 | private Q_SLOTS: 60 | inline void runOnClientThread(const std::function &callback); 61 | 62 | signals: 63 | void connectToHostError(const QString &hostName, const quint16 &port); 64 | 65 | void connectToHostTimeout(const QString &hostName, const quint16 &port); 66 | 67 | void connectToHostSucceed(const QString &hostName, const quint16 &port); 68 | 69 | void remoteHostClosed(const QString &hostName, const quint16 &port); 70 | 71 | void readyToDelete(const QString &hostName, const quint16 &port); 72 | 73 | private: 74 | JQNetworkClientSharedPointer jqNetworkClient_; 75 | }; 76 | 77 | // inc import 78 | #include "jqnetwork_clientforqml.inc" 79 | 80 | #endif//JQNETWORK_INCLUDE_JQNETWORK_CLIENGFORQML_H_ 81 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_clientforqml.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_CLIENGFORQML_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_CLIENGFORQML_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_clientforqml.h" 18 | 19 | inline void JQNetworkClientForQml::runOnClientThread(const std::function &callback) 20 | { 21 | callback(); 22 | } 23 | 24 | #endif//JQNETWORK_INCLUDE_JQNETWORK_CLIENGFORQML_INC_ 25 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_connect.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_CONNECT_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_CONNECT_H_ 15 | 16 | // JQNetwork lib import 17 | #include 18 | 19 | struct JQNetworkConnectSettings 20 | { 21 | bool longConnection = true; 22 | bool autoMaintainLongConnection = false; 23 | 24 | int streamFormat = -1; 25 | qint64 cutPackageSize = JQNETWORKPACKAGE_ADVISE_CUTPACKAGESIZE; 26 | qint64 packageCompressionMinimumBytes = 1024; 27 | int packageCompressionThresholdForConnectSucceedElapsed = 500; 28 | qint64 maximumSendForTotalByteCount = -1; // reserve 29 | qint64 maximumSendPackageByteCount = -1; // reserve 30 | int maximumSendSpeed = -1; // Byte/s reserve 31 | qint64 maximumReceiveForTotalByteCount = -1; // reserve 32 | qint64 maximumReceivePackageByteCount = -1;// reserve 33 | int maximumReceiveSpeed = -1; // Byte/s reserve 34 | bool fileTransferEnabled = false; 35 | 36 | qint32 randomFlagRangeStart = -1; 37 | qint32 randomFlagRangeEnd = -1; 38 | 39 | int maximumConnectToHostWaitTime = 15 * 1000; 40 | int maximumSendPackageWaitTime = 30 * 1000; 41 | int maximumReceivePackageWaitTime = 30 * 1000; 42 | int maximumFileWriteWaitTime = 30 * 1000; 43 | int maximumConnectionTime = -1; 44 | 45 | std::function< void( const JQNetworkConnectPointer & ) > connectToHostErrorCallback = nullptr; 46 | std::function< void( const JQNetworkConnectPointer & ) > connectToHostTimeoutCallback = nullptr; 47 | std::function< void( const JQNetworkConnectPointer & ) > connectToHostSucceedCallback = nullptr; 48 | std::function< void( const JQNetworkConnectPointer & ) > remoteHostClosedCallback = nullptr; 49 | std::function< void( const JQNetworkConnectPointer & ) > readyToDeleteCallback = nullptr; 50 | std::function< void( const JQNetworkConnectPointer &, const qint32 &, const qint64 &, const qint64 &, const qint64 & ) > packageSendingCallback = nullptr; 51 | std::function< void( const JQNetworkConnectPointer &, const qint32 &, const qint64 &, const qint64 &, const qint64 & ) > packageReceivingCallback = nullptr; 52 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkPackageSharedPointer & ) > packageReceivedCallback = nullptr; 53 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkPackageSharedPointer &, const JQNetworkConnectPointerAndPackageSharedPointerFunction & ) > waitReplyPackageSucceedCallback = nullptr; 54 | std::function< void( const JQNetworkConnectPointer &, const std::function< void(const JQNetworkConnectPointer &connect ) > & ) > waitReplyPackageFailCallback = nullptr; 55 | std::function< QString( const JQNetworkConnectPointer &, const JQNetworkPackageSharedPointer &, const QString & ) > filePathProvider = nullptr; 56 | 57 | void setFilePathProviderToDefaultDir(); 58 | 59 | void setFilePathProviderToDir(const QDir &dir); 60 | }; 61 | 62 | class JQNetworkConnect: public QObject 63 | { 64 | Q_OBJECT 65 | Q_DISABLE_COPY( JQNetworkConnect ) 66 | 67 | private: 68 | struct ReceivedCallbackPackage 69 | { 70 | qint64 sendTime; 71 | JQNetworkConnectPointerAndPackageSharedPointerFunction succeedCallback; 72 | JQNetworkConnectPointerFunction failCallback; 73 | }; 74 | 75 | private: 76 | JQNetworkConnect(const JQNetworkConnectSettingsSharedPointer &connectSettings); 77 | 78 | public: 79 | ~JQNetworkConnect() = default; 80 | 81 | static void createConnect( 82 | const std::function< void(const JQNetworkConnectSharedPointer &) > &onConnectCreatedCallback, 83 | const std::function< void( std::function< void() > ) > &runOnConnectThreadCallback, 84 | const JQNetworkConnectSettingsSharedPointer &connectSettings, 85 | const QString &hostName, 86 | const quint16 &port 87 | ); 88 | 89 | static void createConnect( 90 | const std::function< void(const JQNetworkConnectSharedPointer &) > &onConnectCreatedCallback, 91 | const std::function< void( std::function< void() > ) > &runOnConnectThreadCallback, 92 | const JQNetworkConnectSettingsSharedPointer &connectSettings, 93 | const qintptr &socketDescriptor 94 | ); 95 | 96 | inline QWeakPointer< QTcpSocket > tcpSocket(); 97 | 98 | inline bool onceConnectSucceed() const; 99 | 100 | inline bool isAbandonTcpSocket() const; 101 | 102 | inline qint64 connectCreateTime() const; 103 | 104 | inline qint64 connectSucceedTime() const; 105 | 106 | inline qint64 waitForSendBytes() const; 107 | 108 | inline qint64 alreadyWrittenBytes() const; 109 | 110 | inline qint64 connectSucceedElapsed() const; 111 | 112 | void close(); 113 | 114 | qint32 sendPayloadData( 115 | const QString &targetActionFlag, 116 | const QByteArray &payloadData, 117 | const QVariantMap &appendData, 118 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback = nullptr, 119 | const JQNetworkConnectPointerFunction &failCallback = nullptr 120 | ); 121 | 122 | inline qint32 sendPayloadData( 123 | const QByteArray &payloadData, 124 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback = nullptr, 125 | const JQNetworkConnectPointerFunction &failCallback = nullptr 126 | ); 127 | 128 | qint32 sendVariantMapData( 129 | const QString &targetActionFlag, 130 | const QVariantMap &variantMap, 131 | const QVariantMap &appendData, 132 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback = nullptr, 133 | const JQNetworkConnectPointerFunction &failCallback = nullptr 134 | ); 135 | 136 | inline qint32 sendVariantMapData( 137 | const QVariantMap &variantMap, 138 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback = nullptr, 139 | const JQNetworkConnectPointerFunction &failCallback = nullptr 140 | ); 141 | 142 | qint32 sendFileData( 143 | const QString &targetActionFlag, 144 | const QFileInfo &fileInfo, 145 | const QVariantMap &appendData, 146 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback = nullptr, 147 | const JQNetworkConnectPointerFunction &failCallback = nullptr 148 | ); 149 | 150 | inline qint32 sendFileData( 151 | const QFileInfo &fileInfo, 152 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback = nullptr, 153 | const JQNetworkConnectPointerFunction &failCallback = nullptr 154 | ); 155 | 156 | qint32 replyPayloadData( 157 | const qint32 &receivedPackageRandomFlag, 158 | const QByteArray &payloadData, 159 | const QVariantMap &appendData = QVariantMap() 160 | ); 161 | 162 | qint32 replyVariantMapData( 163 | const qint32 &receivedPackageRandomFlag, 164 | const QVariantMap &variantMap, 165 | const QVariantMap &appendData = QVariantMap() 166 | ); 167 | 168 | qint32 replyFile( 169 | const qint32 &receivedPackageRandomFlag, 170 | const QFileInfo &fileInfo, 171 | const QVariantMap &appendData = QVariantMap() 172 | ); 173 | 174 | bool putPayloadData( 175 | const QString &targetActionFlag, 176 | const QByteArray &payloadData, 177 | const QVariantMap &appendData = QVariantMap() 178 | ); 179 | 180 | inline bool putPayloadData( 181 | const QByteArray &payloadData, 182 | const QVariantMap &appendData = QVariantMap() 183 | ); 184 | 185 | bool putVariantMapData( 186 | const QString &targetActionFlag, 187 | const QVariantMap &variantMap, 188 | const QVariantMap &appendData = QVariantMap() 189 | ); 190 | 191 | inline bool putVariantMapData( 192 | const QVariantMap &variantMap, 193 | const QVariantMap &appendData = QVariantMap() 194 | ); 195 | 196 | bool putFile( 197 | const QString &targetActionFlag, 198 | const QFileInfo &fileInfo, 199 | const QVariantMap &appendData = QVariantMap() 200 | ); 201 | 202 | inline bool putFile( 203 | const QFileInfo &fileInfo, 204 | const QVariantMap &appendData = QVariantMap() 205 | ); 206 | 207 | private Q_SLOTS: 208 | void onTcpSocketStateChanged(); 209 | 210 | void onTcpSocketBytesWritten(const qint64 &bytes); 211 | 212 | void onTcpSocketReadyRead(); 213 | 214 | void onTcpSocketConnectToHostTimeOut(); 215 | 216 | void onSendPackageCheck(); 217 | 218 | private: 219 | void startTimerForConnectToHostTimeOut(); 220 | 221 | void startTimerForSendPackageCheck(); 222 | 223 | void onDataTransportPackageReceived(const JQNetworkPackageSharedPointer &package); 224 | 225 | bool onFileDataTransportPackageReceived( 226 | const JQNetworkPackageSharedPointer &package, 227 | const bool &callbackOnFinish 228 | ); 229 | 230 | void onReadyToDelete(); 231 | 232 | qint32 nextRandomFlag(); 233 | 234 | inline bool needCompressionPayloadData(const int &dataSize); 235 | 236 | bool readySendPayloadData( 237 | const qint32 &randomFlag, 238 | const QString &targetActionFlag, 239 | const QByteArray &payloadData, 240 | const QVariantMap &appendData, 241 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 242 | const JQNetworkConnectPointerFunction &failCallback 243 | ); 244 | 245 | bool readySendFileData( 246 | const qint32 &randomFlag, 247 | const QString &targetActionFlag, 248 | const QFileInfo &fileInfo, 249 | const QVariantMap &appendData, 250 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 251 | const JQNetworkConnectPointerFunction &failCallback 252 | ); 253 | 254 | void readySendPackages( 255 | const qint32 &randomFlag, 256 | QList< JQNetworkPackageSharedPointer > &packages, 257 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 258 | const JQNetworkConnectPointerFunction &failCallback 259 | ); 260 | 261 | void sendDataRequestToRemote(const JQNetworkPackageSharedPointer &package); 262 | 263 | void sendPackageToRemote(const JQNetworkPackageSharedPointer &package); 264 | 265 | private: 266 | // Settings 267 | JQNetworkConnectSettingsSharedPointer connectSettings_; 268 | std::function< void( std::function< void() > ) > runOnConnectThreadCallback_; 269 | 270 | // Socket 271 | QSharedPointer< QTcpSocket > tcpSocket_; 272 | bool onceConnectSucceed_ = false; 273 | bool isAbandonTcpSocket_ = false; 274 | QByteArray tcpSocketBuffer_; 275 | 276 | // Timer 277 | QSharedPointer< QTimer > timerForConnectToHostTimeOut_; 278 | QSharedPointer< QTimer > timerForSendPackageCheck_; 279 | 280 | // Package 281 | QMutex mutexForSend_; 282 | qint32 sendRandomFlagRotaryIndex_ = 0; 283 | QMap< qint32, ReceivedCallbackPackage > onReceivedCallbacks_; // randomFlag -> package 284 | 285 | // Payload 286 | QMap< qint32, QList< JQNetworkPackageSharedPointer > > sendPayloadPackagePool_; // randomFlag -> package 287 | QMap< qint32, JQNetworkPackageSharedPointer > receivePayloadPackagePool_; // randomFlag -> package 288 | 289 | // File 290 | QMap< qint32, QSharedPointer< QFile > > waitForSendFiles_; // randomFlag -> file 291 | QMap< qint32, QPair< JQNetworkPackageSharedPointer, QSharedPointer< QFile > > > receivedFilePackagePool_; // randomFlag -> { package, file } 292 | 293 | // Statistics 294 | qint64 connectCreateTime_ = 0; 295 | qint64 connectSucceedTime_ = 0; 296 | qint64 waitForSendBytes_ = 0; 297 | qint64 alreadyWrittenBytes_ = 0; 298 | }; 299 | 300 | // inc import 301 | #include "jqnetwork_connect.inc" 302 | 303 | #endif//JQNETWORK_INCLUDE_JQNETWORK_CONNECT_H_ 304 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_connect.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_CONNECT_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_CONNECT_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_connect.h" 18 | 19 | inline QWeakPointer< QTcpSocket > JQNetworkConnect::tcpSocket() 20 | { 21 | return tcpSocket_.toWeakRef(); 22 | } 23 | 24 | inline bool JQNetworkConnect::onceConnectSucceed() const 25 | { 26 | return onceConnectSucceed_; 27 | } 28 | 29 | inline bool JQNetworkConnect::isAbandonTcpSocket() const 30 | { 31 | return isAbandonTcpSocket_; 32 | } 33 | 34 | inline qint64 JQNetworkConnect::connectCreateTime() const 35 | { 36 | return connectCreateTime_; 37 | } 38 | 39 | inline qint64 JQNetworkConnect::connectSucceedTime() const 40 | { 41 | return connectSucceedTime_; 42 | } 43 | 44 | inline qint64 JQNetworkConnect::waitForSendBytes() const 45 | { 46 | return waitForSendBytes_; 47 | } 48 | 49 | inline qint64 JQNetworkConnect::alreadyWrittenBytes() const 50 | { 51 | return alreadyWrittenBytes_; 52 | } 53 | 54 | inline qint64 JQNetworkConnect::connectSucceedElapsed() const 55 | { 56 | if ( !connectSucceedTime_ ) { return -1; } 57 | 58 | return connectSucceedTime_ - connectCreateTime_; 59 | } 60 | 61 | inline qint32 JQNetworkConnect::sendPayloadData( 62 | const QByteArray &payloadData, 63 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 64 | const JQNetworkConnectPointerFunction &failCallback 65 | ) 66 | { 67 | return this->sendPayloadData( 68 | { }, // empty targetActionFlag 69 | payloadData, 70 | { }, // empty appendData 71 | succeedCallback, 72 | failCallback 73 | ); 74 | } 75 | 76 | inline qint32 JQNetworkConnect::sendVariantMapData( 77 | const QVariantMap &variantMap, 78 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 79 | const JQNetworkConnectPointerFunction &failCallback 80 | ) 81 | { 82 | return this->sendVariantMapData( 83 | { }, // empty targetActionFlag 84 | variantMap, 85 | { }, // empty appendData 86 | succeedCallback, 87 | failCallback 88 | ); 89 | } 90 | 91 | inline qint32 JQNetworkConnect::sendFileData( 92 | const QFileInfo &fileInfo, 93 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback, 94 | const JQNetworkConnectPointerFunction &failCallback 95 | ) 96 | { 97 | return this->sendFileData( 98 | { }, // empty targetActionFlag 99 | fileInfo, 100 | { }, // empty appendData 101 | succeedCallback, 102 | failCallback 103 | ); 104 | } 105 | 106 | inline bool JQNetworkConnect::putPayloadData( 107 | const QByteArray &payloadData, 108 | const QVariantMap &appendData 109 | ) 110 | { 111 | return this->putPayloadData( 112 | { }, // empty targetActionFlag, 113 | payloadData, 114 | appendData 115 | ); 116 | } 117 | 118 | inline bool JQNetworkConnect::putVariantMapData( 119 | const QVariantMap &variantMap, 120 | const QVariantMap &appendData 121 | ) 122 | { 123 | return this->putVariantMapData( 124 | { }, // empty targetActionFlag, 125 | variantMap, 126 | appendData 127 | ); 128 | } 129 | 130 | inline bool JQNetworkConnect::putFile( 131 | const QFileInfo &fileInfo, 132 | const QVariantMap &appendData 133 | ) 134 | { 135 | return this->putFile( 136 | { }, // empty targetActionFlag, 137 | fileInfo, 138 | appendData 139 | ); 140 | } 141 | 142 | inline bool JQNetworkConnect::needCompressionPayloadData(const int &dataSize) 143 | { 144 | bool compressionPayloadData = false; 145 | 146 | if ( connectSettings_->packageCompressionThresholdForConnectSucceedElapsed != -1) 147 | { 148 | if ( this->connectSucceedElapsed() >= connectSettings_->packageCompressionThresholdForConnectSucceedElapsed ) 149 | { 150 | compressionPayloadData = true; 151 | } 152 | 153 | if ( ( connectSettings_->packageCompressionMinimumBytes != -1 ) && 154 | ( dataSize < connectSettings_->packageCompressionMinimumBytes ) ) 155 | { 156 | compressionPayloadData = false; 157 | } 158 | } 159 | 160 | return compressionPayloadData; 161 | } 162 | 163 | #endif//JQNETWORK_INCLUDE_JQNETWORK_CONNECT_INC_ 164 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_connectpool.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_CONNECTPOOL_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_CONNECTPOOL_H_ 15 | 16 | // JQNetwork lib import 17 | #include 18 | 19 | struct JQNetworkConnectPoolSettings 20 | { 21 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer & ) > connectToHostErrorCallback = nullptr; 22 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer & ) > connectToHostTimeoutCallback = nullptr; 23 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer & ) > connectToHostSucceedCallback = nullptr; 24 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer & ) > remoteHostClosedCallback = nullptr; 25 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer & ) > readyToDeleteCallback = nullptr; 26 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer &, const qint32 &, const qint64 &, const qint64 &, const qint64 & ) > packageSendingCallback = nullptr; 27 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer &, const qint32 &, const qint64 &, const qint64 &, const qint64 & ) > packageReceivingCallback = nullptr; 28 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer &, const JQNetworkPackageSharedPointer & ) > packageReceivedCallback = nullptr; 29 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer &, const JQNetworkPackageSharedPointer &, const JQNetworkConnectPointerAndPackageSharedPointerFunction & ) > waitReplyPackageSucceedCallback = nullptr; 30 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkConnectPoolPointer &, const JQNetworkConnectPointerFunction & ) > waitReplyPackageFailCallback = nullptr; 31 | }; 32 | 33 | class JQNetworkConnectPool: public QObject 34 | { 35 | Q_OBJECT 36 | Q_DISABLE_COPY( JQNetworkConnectPool ) 37 | 38 | public: 39 | JQNetworkConnectPool( 40 | JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings, 41 | JQNetworkConnectSettingsSharedPointer connectSettings 42 | ); 43 | 44 | ~JQNetworkConnectPool(); 45 | 46 | void createConnect( 47 | const std::function< void( std::function< void() > ) > runOnConnectThreadCallback, 48 | const QString &hostName, 49 | const quint16 &port 50 | ); 51 | 52 | void createConnect( 53 | const std::function< void( std::function< void() > ) > runOnConnectThreadCallback, 54 | const qintptr &socketDescriptor 55 | ); 56 | 57 | inline bool containsConnect(const QString &hostName, const quint16 &port); 58 | 59 | inline bool containsConnect(const qintptr &socketDescriptor); 60 | 61 | QPair< QString, quint16 > getHostAndPortByConnect(const JQNetworkConnectPointer &connect); 62 | 63 | qintptr getSocketDescriptorByConnect(const JQNetworkConnectPointer &connect); 64 | 65 | JQNetworkConnectPointer getConnectByHostAndPort(const QString &hostName, const quint16 &port); 66 | 67 | JQNetworkConnectPointer getConnectBySocketDescriptor(const qintptr &socketDescriptor); 68 | 69 | private: 70 | inline void onConnectToHostError(const JQNetworkConnectPointer &connectz); 71 | 72 | inline void onConnectToHostTimeout(const JQNetworkConnectPointer &connect); 73 | 74 | void onConnectToHostSucceed(const JQNetworkConnectPointer &connect); 75 | 76 | inline void onRemoteHostClosed(const JQNetworkConnectPointer &connect); 77 | 78 | void onReadyToDelete(const JQNetworkConnectPointer &connect); 79 | 80 | inline void onPackageSending( 81 | const JQNetworkConnectPointer &connect, 82 | const qint32 &randomFlag, 83 | const qint64 &payloadCurrentIndex, 84 | const qint64 &payloadCurrentSize, 85 | const qint64 &payloadTotalSize 86 | ); 87 | 88 | inline void onPackageReceiving( 89 | const JQNetworkConnectPointer &connect, 90 | const qint32 &randomFlag, 91 | const qint64 &payloadCurrentIndex, 92 | const qint64 &payloadCurrentSize, 93 | const qint64 &payloadTotalSize 94 | ); 95 | 96 | inline void onPackageReceived( 97 | const JQNetworkConnectPointer &connect, 98 | const JQNetworkPackageSharedPointer &package 99 | ); 100 | 101 | inline void onWaitReplyPackageSucceed( 102 | const JQNetworkConnectPointer &connect, 103 | const JQNetworkPackageSharedPointer &package, 104 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback 105 | ); 106 | 107 | inline void onWaitReplyPackageFail( 108 | const JQNetworkConnectPointer &connect, 109 | const JQNetworkConnectPointerFunction &failCallback 110 | ); 111 | 112 | private: 113 | // Settings 114 | JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings_; 115 | JQNetworkConnectSettingsSharedPointer connectSettings_; 116 | 117 | // Connect 118 | QMap< JQNetworkConnect *, JQNetworkConnectSharedPointer > connectForConnecting_; 119 | QMap< JQNetworkConnect *, JQNetworkConnectSharedPointer > connectForConnected_; 120 | 121 | QMap< QString, JQNetworkConnectPointer > bimapForHostAndPort1; // "127.0.0.1:34543" -> Connect 122 | QMap< JQNetworkConnect *, QString > bimapForHostAndPort2; // Connect -> "127.0.0.1:34543" 123 | QMap< qintptr, JQNetworkConnectPointer > bimapForSocketDescriptor1; // socketDescriptor -> Connect 124 | QMap< JQNetworkConnect *, qintptr > bimapForSocketDescriptor2; // Connect -> socketDescriptor 125 | 126 | // Other 127 | QMutex mutex_; 128 | }; 129 | 130 | // inc import 131 | #include "jqnetwork_connectpool.inc" 132 | 133 | #endif//JQNETWORK_INCLUDE_JQNETWORK_CONNECTPOOL_H_ 134 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_connectpool.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_CONNECTPOOL_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_CONNECTPOOL_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_connectpool.h" 18 | 19 | inline bool JQNetworkConnectPool::containsConnect(const QString &hostName, const quint16 &port) 20 | { 21 | mutex_.lock(); 22 | 23 | auto contains = bimapForHostAndPort1.contains( QString( "%1:%2" ).arg( hostName ).arg( port ) ); 24 | 25 | mutex_.unlock(); 26 | 27 | return contains; 28 | } 29 | 30 | inline bool JQNetworkConnectPool::containsConnect(const qintptr &socketDescriptor) 31 | { 32 | mutex_.lock(); 33 | 34 | auto contains = bimapForSocketDescriptor1.contains( socketDescriptor ); 35 | 36 | mutex_.unlock(); 37 | 38 | return contains; 39 | } 40 | 41 | inline void JQNetworkConnectPool::onConnectToHostError(const JQNetworkConnectPointer &connect) 42 | { 43 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->connectToHostErrorCallback ); 44 | connectPoolSettings_->connectToHostErrorCallback( connect, this ); 45 | } 46 | 47 | inline void JQNetworkConnectPool::onConnectToHostTimeout(const JQNetworkConnectPointer &connect) 48 | { 49 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->connectToHostTimeoutCallback ); 50 | connectPoolSettings_->connectToHostTimeoutCallback( connect, this ); 51 | } 52 | 53 | inline void JQNetworkConnectPool::onRemoteHostClosed(const JQNetworkConnectPointer &connect) 54 | { 55 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->remoteHostClosedCallback ); 56 | connectPoolSettings_->remoteHostClosedCallback( connect, this ); 57 | } 58 | 59 | inline void JQNetworkConnectPool::onPackageSending( 60 | const JQNetworkConnectPointer &connect, 61 | const qint32 &randomFlag, 62 | const qint64 &payloadCurrentIndex, 63 | const qint64 &payloadCurrentSize, 64 | const qint64 &payloadTotalSize 65 | ) 66 | { 67 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->packageSendingCallback ); 68 | connectPoolSettings_->packageSendingCallback( connect, this, randomFlag, payloadCurrentIndex, payloadCurrentSize, payloadTotalSize ); 69 | } 70 | 71 | inline void JQNetworkConnectPool::onPackageReceiving( 72 | const JQNetworkConnectPointer &connect, 73 | const qint32 &randomFlag, 74 | const qint64 &payloadCurrentIndex, 75 | const qint64 &payloadCurrentSize, 76 | const qint64 &payloadTotalSize 77 | ) 78 | { 79 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->packageReceivingCallback ); 80 | connectPoolSettings_->packageReceivingCallback( connect, this, randomFlag, payloadCurrentIndex, payloadCurrentSize, payloadTotalSize ); 81 | } 82 | 83 | inline void JQNetworkConnectPool::onPackageReceived( 84 | const JQNetworkConnectPointer &connect, 85 | const JQNetworkPackageSharedPointer &package 86 | ) 87 | { 88 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->packageReceivedCallback ); 89 | connectPoolSettings_->packageReceivedCallback( connect, this, package ); 90 | } 91 | 92 | inline void JQNetworkConnectPool::onWaitReplyPackageSucceed( 93 | const JQNetworkConnectPointer &connect, 94 | const JQNetworkPackageSharedPointer &package, 95 | const JQNetworkConnectPointerAndPackageSharedPointerFunction &succeedCallback 96 | ) 97 | { 98 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->waitReplyPackageSucceedCallback ); 99 | connectPoolSettings_->waitReplyPackageSucceedCallback( connect, this, package, succeedCallback ); 100 | } 101 | 102 | inline void JQNetworkConnectPool::onWaitReplyPackageFail( 103 | const JQNetworkConnectPointer &connect, 104 | const JQNetworkConnectPointerFunction &failCallback 105 | ) 106 | { 107 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->waitReplyPackageFailCallback ); 108 | connectPoolSettings_->waitReplyPackageFailCallback( connect, this, failCallback ); 109 | } 110 | 111 | #endif//JQNETWORK_INCLUDE_JQNETWORK_CONNECTPOOL_INC_ 112 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_foundation.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_FOUNDATION_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_FOUNDATION_H_ 15 | 16 | // C++ lib import 17 | #include 18 | #include 19 | #include 20 | 21 | // Qt lib import 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | #define JQNETWORK_VERSIONNUMBER QVersionNumber::fromString( JQNETWORK_VERSIONSTRING ) 31 | 32 | #define JQNETWORKPACKAGE_BOOTFLAG qint8( 0x7d ) 33 | #define JQNETWORKPACKAGE_PAYLOADDATATRANSPORTPACKGEFLAG qint8( 0x1 ) 34 | #define JQNETWORKPACKAGE_PAYLOADDATAREQUESTPACKGEFLAG qint8( 0x2 ) 35 | #define JQNETWORKPACKAGE_FILEDATATRANSPORTPACKGEFLAG qint8( 0x3 ) 36 | #define JQNETWORKPACKAGE_FILEDATAREQUESTPACKGEFLAG qint8( 0x4 ) 37 | #define JQNETWORKPACKAGE_UNCOMPRESSEDFLAG qint8( 0x1 ) 38 | #define JQNETWORKPACKAGE_COMPRESSEDFLAG qint8( 0x2 ) 39 | 40 | #if ( defined Q_OS_IOS ) || ( defined Q_OS_ANDROID ) 41 | # define JQNETWORK_ADVISE_THREADCOUNT 1 42 | # define JQNETWORKPACKAGE_ADVISE_CUTPACKAGESIZE qint64( 512 * 1024 ) 43 | #else 44 | # define JQNETWORK_ADVISE_THREADCOUNT 2 45 | # define JQNETWORKPACKAGE_ADVISE_CUTPACKAGESIZE qint64( 2 * 1024 * 1024 ) 46 | #endif 47 | 48 | #define JQNETWORK_NULLPTR_CHECK( ptr, ... ) \ 49 | if ( !ptr ) { qDebug( "%s: %s is null", __func__, # ptr ); return __VA_ARGS__; } 50 | 51 | #define JQNETWORK_THISNULL_CHECK( message, ... ) \ 52 | { \ 53 | auto this_ = this; \ 54 | if ( !this_ ) \ 55 | { \ 56 | qDebug( "%s: this is null", message ); \ 57 | return __VA_ARGS__; \ 58 | } \ 59 | } 60 | 61 | class QSemaphore; 62 | class QMutex; 63 | class QTimer; 64 | class QThreadPool; 65 | class QEventLoop; 66 | class QJsonObject; 67 | class QJsonArray; 68 | class QJsonValue; 69 | class QJsonDocument; 70 | class QFile; 71 | class QDir; 72 | class QFileInfo; 73 | class QTcpSocket; 74 | class QTcpServer; 75 | class QUdpSocket; 76 | 77 | template < typename T > class QVector; 78 | template < typename T > class QSet; 79 | 80 | class JQNetworkPackage; 81 | class JQNetworkConnect; 82 | class JQNetworkConnectPool; 83 | class JQNetworkServer; 84 | class JQNetworkProcessor; 85 | class JQNetworkClient; 86 | class JQNetworkLan; 87 | 88 | struct JQNetworkConnectSettings; 89 | struct JQNetworkConnectPoolSettings; 90 | struct JQNetworkServerSettings; 91 | struct JQNetworkClientSettings; 92 | struct JQNetworkLanSettings; 93 | struct JQNetworkLanNode; 94 | 95 | typedef QPointer< JQNetworkPackage > JQNetworkPackagePointer; 96 | typedef QPointer< JQNetworkConnect > JQNetworkConnectPointer; 97 | typedef QPointer< JQNetworkConnectPool > JQNetworkConnectPoolPointer; 98 | typedef QPointer< JQNetworkServer > JQNetworkServerPointer; 99 | typedef QPointer< JQNetworkProcessor > JQNetworkProcessorPointer; 100 | typedef QPointer< JQNetworkClient > JQNetworkClientPointer; 101 | typedef QPointer< JQNetworkLan > JQNetworkLanPointer; 102 | 103 | typedef std::shared_ptr< void > JQNetworkVoidSharedPointer; 104 | 105 | typedef QSharedPointer< JQNetworkPackage > JQNetworkPackageSharedPointer; 106 | typedef QSharedPointer< JQNetworkConnect > JQNetworkConnectSharedPointer; 107 | typedef QSharedPointer< JQNetworkConnectPool > JQNetworkConnectPoolSharedPointer; 108 | typedef QSharedPointer< JQNetworkServer > JQNetworkServerSharedPointer; 109 | typedef QSharedPointer< JQNetworkProcessor > JQNetworkProcessorSharedPointer; 110 | typedef QSharedPointer< JQNetworkClient > JQNetworkClientSharedPointer; 111 | typedef QSharedPointer< JQNetworkLan > JQNetworkLanSharedPointer; 112 | 113 | typedef QSharedPointer< JQNetworkConnectSettings > JQNetworkConnectSettingsSharedPointer; 114 | typedef QSharedPointer< JQNetworkConnectPoolSettings > JQNetworkConnectPoolSettingsSharedPointer; 115 | typedef QSharedPointer< JQNetworkServerSettings > JQNetworkServerSettingsSharedPointer; 116 | typedef QSharedPointer< JQNetworkClientSettings > JQNetworkClientSettingsSharedPointer; 117 | typedef QSharedPointer< JQNetworkLanSettings > JQNetworkLanSettingsSharedPointer; 118 | 119 | typedef std::function< void(const JQNetworkConnectPointer &connect ) > JQNetworkConnectPointerFunction; 120 | typedef std::function< void(const JQNetworkConnectPointer &connect, const JQNetworkPackageSharedPointer &package ) > JQNetworkConnectPointerAndPackageSharedPointerFunction; 121 | 122 | struct JQNetworkOnReceivedCallbackPackage 123 | { 124 | std::function< void(const JQNetworkConnectPointer &connect, const JQNetworkPackageSharedPointer &) > succeedCallback = nullptr; 125 | std::function< void(const JQNetworkConnectPointer &connect) > failCallback = nullptr; 126 | }; 127 | 128 | class JQNetworkThreadPoolHelper: public QObject 129 | { 130 | Q_OBJECT 131 | Q_DISABLE_COPY( JQNetworkThreadPoolHelper ) 132 | 133 | public: 134 | JQNetworkThreadPoolHelper(); 135 | 136 | ~JQNetworkThreadPoolHelper() = default; 137 | 138 | void run(const std::function< void() > &callback); 139 | 140 | public Q_SLOTS: 141 | void onRun(); 142 | 143 | private: 144 | QMutex mutex_; 145 | QSharedPointer< std::vector< std::function< void() > > > waitForRunCallbacks_; 146 | bool alreadyCall_ = false; 147 | qint64 lastRunTime_ = 0; 148 | int lastRunCallbackCount_ = 0; 149 | }; 150 | 151 | class JQNetworkThreadPool: public QObject 152 | { 153 | Q_OBJECT 154 | Q_DISABLE_COPY( JQNetworkThreadPool ) 155 | 156 | public: 157 | JQNetworkThreadPool(const int &threadCount); 158 | 159 | ~JQNetworkThreadPool(); 160 | 161 | inline int nextRotaryIndex(); 162 | 163 | int run(const std::function< void() > &callback, const int &threadIndex = -1); 164 | 165 | inline void runEach(const std::function< void() > &callback); 166 | 167 | int waitRun(const std::function< void() > &callback, const int &threadIndex = -1); 168 | 169 | inline void waitRunEach(const std::function< void() > &callback); 170 | 171 | private: 172 | QSharedPointer< QThreadPool > threadPool_; 173 | QSharedPointer< QVector< QPointer< QEventLoop > > > eventLoops_; 174 | QSharedPointer< QVector< QPointer< JQNetworkThreadPoolHelper > > > helpers_; 175 | int rotaryIndex_ = -1; 176 | }; 177 | 178 | class JQNetworkNodeMark 179 | { 180 | public: 181 | JQNetworkNodeMark(const QString &dutyMark); 182 | 183 | ~JQNetworkNodeMark() = default; 184 | 185 | static QString calculateNodeMarkSummary(const QString &dutyMark); 186 | 187 | inline qint64 applicationStartTime() const; 188 | 189 | inline QString applicationFilePath() const; 190 | 191 | inline QString localHostName() const; 192 | 193 | inline qint64 nodeMarkCreatedTime() const; 194 | 195 | inline QString nodeMarkClassAddress() const; 196 | 197 | inline QString dutyMark() const; 198 | 199 | inline QString nodeMarkSummary() const; 200 | 201 | private: 202 | static qint64 applicationStartTime_; 203 | static QString applicationFilePath_; 204 | static QString localHostName_; 205 | qint64 nodeMarkCreatedTime_; 206 | QString nodeMarkClassAddress_; 207 | QString dutyMark_; 208 | QString nodeMarkSummary_; 209 | }; 210 | 211 | namespace JQNetwork 212 | { 213 | 214 | void printVersionInformation(const char *jqNetworkCompileModeString = JQNETWORK_COMPILE_MODE_STRING); 215 | 216 | } 217 | 218 | // inc import 219 | #include "jqnetwork_foundation.inc" 220 | 221 | #endif//JQNETWORK_INCLUDE_JQNETWORK_FOUNDATION_H_ 222 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_foundation.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_FOUNDATION_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_FOUNDATION_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_foundation.h" 18 | 19 | // JQNetworkThreadPool 20 | inline int JQNetworkThreadPool::nextRotaryIndex() 21 | { 22 | rotaryIndex_ = ( rotaryIndex_ + 1 ) % helpers_->size(); 23 | return rotaryIndex_; 24 | } 25 | 26 | inline void JQNetworkThreadPool::runEach(const std::function &callback) 27 | { 28 | for ( auto index = 0; index < helpers_->size(); ++index ) 29 | { 30 | ( *helpers_ )[ index ]->run( callback ); 31 | } 32 | } 33 | 34 | inline void JQNetworkThreadPool::waitRunEach(const std::function &callback) 35 | { 36 | for ( auto index = 0; index < helpers_->size(); ++index ) 37 | { 38 | this->waitRun( callback, index ); 39 | } 40 | } 41 | 42 | // JQNetworkNodeMark 43 | inline qint64 JQNetworkNodeMark::applicationStartTime() const 44 | { 45 | return applicationStartTime_; 46 | } 47 | 48 | inline QString JQNetworkNodeMark::applicationFilePath() const 49 | { 50 | return applicationFilePath_; 51 | } 52 | 53 | inline QString JQNetworkNodeMark::localHostName() const 54 | { 55 | return localHostName_; 56 | } 57 | 58 | inline qint64 JQNetworkNodeMark::nodeMarkCreatedTime() const 59 | { 60 | return nodeMarkCreatedTime_; 61 | } 62 | 63 | inline QString JQNetworkNodeMark::nodeMarkClassAddress() const 64 | { 65 | return nodeMarkClassAddress_; 66 | } 67 | 68 | inline QString JQNetworkNodeMark::dutyMark() const 69 | { 70 | return dutyMark_; 71 | } 72 | 73 | inline QString JQNetworkNodeMark::nodeMarkSummary() const 74 | { 75 | return nodeMarkSummary_; 76 | } 77 | 78 | #endif//JQNETWORK_INCLUDE_JQNETWORK_FOUNDATION_INC_ 79 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_lan.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_LAN_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_LAN_H_ 15 | 16 | // JQNetwork lib import 17 | #include 18 | 19 | struct JQNetworkLanSettings 20 | { 21 | QString dutyMark; 22 | 23 | QHostAddress multicastGroupAddress; 24 | quint16 bindPort = 0; 25 | 26 | int checkLoopInterval = 10 * 1000; 27 | int lanNodeTimeoutInterval = 60 * 1000; 28 | 29 | std::function< void( const JQNetworkLanNode & ) > lanNodeOnlineCallback; 30 | std::function< void( const JQNetworkLanNode & ) > lanNodeActiveCallback; 31 | std::function< void( const JQNetworkLanNode & ) > lanNodeOfflineCallback; 32 | std::function< void() > lanNodeListChangedCallback; 33 | 34 | int globalProcessorThreadCount = 1; 35 | }; 36 | 37 | struct JQNetworkLanNode 38 | { 39 | QString nodeMarkSummary; 40 | QString dutyMark; 41 | int dataPackageIndex = 0; 42 | qint64 lastActiveTime = 0; 43 | QList< QHostAddress > ipList; 44 | QVariant appendData; 45 | QHostAddress matchAddress; 46 | bool isSelf = false; 47 | }; 48 | 49 | struct JQNetworkLanAddressEntries 50 | { 51 | QHostAddress ip; 52 | QHostAddress netmask; 53 | QHostAddress ipSegment; 54 | bool isVmAddress; 55 | }; 56 | 57 | class JQNetworkLan: public QObject 58 | { 59 | Q_OBJECT 60 | 61 | public: 62 | JQNetworkLan(const JQNetworkLanSettingsSharedPointer &lanSettings); 63 | 64 | ~JQNetworkLan(); 65 | 66 | JQNetworkLan(const JQNetworkLan &) = delete; 67 | 68 | JQNetworkLan &operator =(const JQNetworkLan &) = delete; 69 | 70 | static JQNetworkLanSharedPointer createLan( 71 | const QHostAddress &multicastGroupAddress, 72 | const quint16 &bindPort, 73 | const QString &dutyMark = "" 74 | ); 75 | 76 | static QList< JQNetworkLanAddressEntries > lanAddressEntries(); 77 | 78 | inline JQNetworkLanSettingsSharedPointer lanSettings(); 79 | 80 | inline QString nodeMarkSummary() const; 81 | 82 | inline void setAppendData(const QVariant &appendData); 83 | 84 | bool begin(); 85 | 86 | QHostAddress matchLanAddressEntries(const QList< QHostAddress > &ipList); 87 | 88 | QList< JQNetworkLanNode > availableLanNodes(); 89 | 90 | void sendOnline(); 91 | 92 | void sendOffline(); 93 | 94 | private: 95 | void refreshLanAddressEntries(); 96 | 97 | bool refreshUdp(); 98 | 99 | void checkLoop(); 100 | 101 | QByteArray makeData(const bool &requestOffline, const bool &requestFeedback); 102 | 103 | void onUdpSocketReadyRead(); 104 | 105 | inline void onLanNodeStateOnline(const JQNetworkLanNode &lanNode); 106 | 107 | inline void onLanNodeStateActive(const JQNetworkLanNode &lanNode); 108 | 109 | inline void onLanNodeStateOffline(const JQNetworkLanNode &lanNode); 110 | 111 | inline void onLanNodeListChanged(); 112 | 113 | private: 114 | // Thread pool 115 | static QWeakPointer< JQNetworkThreadPool > globalProcessorThreadPool_; 116 | QSharedPointer< JQNetworkThreadPool > processorThreadPool_; 117 | 118 | // Settings 119 | JQNetworkLanSettingsSharedPointer lanSettings_; 120 | 121 | // Socket 122 | QSharedPointer< QUdpSocket > udpSocket_; 123 | 124 | // Data 125 | QList< JQNetworkLanAddressEntries > lanAddressEntries_; 126 | QMap< QString, JQNetworkLanNode > availableLanNodes_; 127 | 128 | // Other 129 | QString nodeMarkSummary_; 130 | QMutex mutex_; 131 | QVariant appendData_; 132 | QSharedPointer< QTimer > timerForCheckLoop_; 133 | int checkLoopCounting_ = -1; 134 | int nextDataPackageIndex_ = 0; 135 | }; 136 | 137 | // inc import 138 | #include "jqnetwork_lan.inc" 139 | 140 | #endif//JQNETWORK_INCLUDE_JQNETWORK_LAN_H_ 141 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_lan.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_LAN_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_LAN_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_lan.h" 18 | 19 | inline JQNetworkLanSettingsSharedPointer JQNetworkLan::lanSettings() 20 | { 21 | return lanSettings_; 22 | } 23 | 24 | inline QString JQNetworkLan::nodeMarkSummary() const 25 | { 26 | return nodeMarkSummary_; 27 | } 28 | 29 | inline void JQNetworkLan::setAppendData(const QVariant &appendData) 30 | { 31 | appendData_ = appendData; 32 | } 33 | 34 | inline void JQNetworkLan::onLanNodeStateOnline(const JQNetworkLanNode &lanNode) 35 | { 36 | if ( !lanSettings_->lanNodeOnlineCallback ) { return; } 37 | 38 | lanSettings_->lanNodeOnlineCallback( lanNode ); 39 | } 40 | 41 | inline void JQNetworkLan::onLanNodeStateActive(const JQNetworkLanNode &lanNode) 42 | { 43 | if ( !lanSettings_->lanNodeActiveCallback ) { return; } 44 | 45 | lanSettings_->lanNodeActiveCallback( lanNode ); 46 | } 47 | 48 | inline void JQNetworkLan::onLanNodeStateOffline(const JQNetworkLanNode &lanNode) 49 | { 50 | if ( !lanSettings_->lanNodeOfflineCallback ) { return; } 51 | 52 | lanSettings_->lanNodeOfflineCallback( lanNode ); 53 | } 54 | 55 | inline void JQNetworkLan::onLanNodeListChanged() 56 | { 57 | if ( !lanSettings_->lanNodeListChangedCallback ) { return; } 58 | 59 | lanSettings_->lanNodeListChangedCallback(); 60 | } 61 | 62 | #endif//JQNETWORK_INCLUDE_JQNETWORK_LAN_INC_ 63 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_package.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_PACKAGE_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_PACKAGE_H_ 15 | 16 | // Qt lib import 17 | #include 18 | 19 | // JQNetwork lib import 20 | #include 21 | 22 | class QFileInfo; 23 | class QDateTime; 24 | 25 | class JQNetworkPackage 26 | { 27 | private: 28 | JQNetworkPackage() = default; 29 | 30 | public: 31 | ~JQNetworkPackage() = default; 32 | 33 | JQNetworkPackage(const JQNetworkPackage &) = delete; 34 | 35 | JQNetworkPackage &operator =(const JQNetworkPackage &) = delete; 36 | 37 | public: 38 | static inline int headSize(); 39 | 40 | static qint32 checkDataIsReadyReceive(const QByteArray &rawData); 41 | 42 | static JQNetworkPackageSharedPointer readPackage(QByteArray &rawData); 43 | 44 | static QList< JQNetworkPackageSharedPointer > createPayloadTransportPackages( 45 | const QString &targetActionFlag, 46 | const QByteArray &payloadData, 47 | const QVariantMap &appendData, 48 | const qint32 &randomFlag, 49 | const qint64 cutPackageSize = -1, 50 | const bool &compressionData = false 51 | ); 52 | 53 | static JQNetworkPackageSharedPointer createFileTransportPackage( 54 | const QString &targetActionFlag, 55 | const QFileInfo &fileInfo, 56 | const QByteArray &fileData, 57 | const QVariantMap &appendData, 58 | const qint32 &randomFlag, 59 | const bool &compressionData = false 60 | ); 61 | 62 | static JQNetworkPackageSharedPointer createPayloadDataRequestPackage(const qint32 &randomFlag); 63 | 64 | static JQNetworkPackageSharedPointer createFileDataRequestPackage(const qint32 &randomFlag); 65 | 66 | inline bool isCompletePackage() const; 67 | 68 | inline bool isAbandonPackage() const; 69 | 70 | 71 | inline qint8 bootFlag() const; 72 | 73 | inline qint8 packageFlag() const; 74 | 75 | inline qint32 randomFlag() const; 76 | 77 | inline qint8 metaDataFlag() const; 78 | 79 | inline qint32 metaDataTotalSize() const; 80 | 81 | inline qint32 metaDataCurrentSize() const; 82 | 83 | inline qint8 payloadDataFlag() const; 84 | 85 | inline qint32 payloadDataTotalSize() const; 86 | 87 | inline qint32 payloadDataCurrentSize() const; 88 | 89 | inline QByteArray metaData() const; 90 | 91 | inline int metaDataSize() const; 92 | 93 | inline QByteArray payloadData() const; 94 | 95 | inline int payloadDataSize() const; 96 | 97 | inline qint32 metaDataOriginalIndex() const; 98 | 99 | inline qint32 metaDataOriginalCurrentSize() const; 100 | 101 | inline qint32 payloadDataOriginalIndex() const; 102 | 103 | inline qint32 payloadDataOriginalCurrentSize() const; 104 | 105 | 106 | inline QVariantMap metaDataInVariantMap() const; 107 | 108 | inline QString targetActionFlag() const; 109 | 110 | inline QVariantMap appendData() const; 111 | 112 | inline QString fileName() const; 113 | 114 | inline qint64 fileSize() const; 115 | 116 | inline qint32 filePermissions() const; 117 | 118 | QDateTime fileCreatedTime() const; 119 | 120 | QDateTime fileLastReadTime() const; 121 | 122 | QDateTime fileLastModifiedTime() const; 123 | 124 | inline bool containsFile() const; 125 | 126 | inline QString localFilePath() const; 127 | 128 | inline void setLocalFilePath(const QString &localFilePath); 129 | 130 | inline void clearMetaData(); 131 | 132 | inline void clearPayloadData(); 133 | 134 | 135 | inline QByteArray toByteArray() const; 136 | 137 | bool mixPackage(const JQNetworkPackageSharedPointer &mixPackage); 138 | 139 | void refreshPackage(); 140 | 141 | private: 142 | bool isCompletePackage_ = false; 143 | bool isAbandonPackage_ = false; 144 | 145 | #pragma pack(push) 146 | #pragma pack(1) 147 | struct Head 148 | { 149 | qint8 bootFlag_ = 0; 150 | qint8 packageFlag_ = 0; 151 | qint32 randomFlag_ = 0; 152 | 153 | qint8 metaDataFlag_ = 0; 154 | qint32 metaDataTotalSize_ = -1; 155 | qint32 metaDataCurrentSize_ = -1; 156 | 157 | qint8 payloadDataFlag_ = 0; 158 | qint32 payloadDataTotalSize_ = -1; 159 | qint32 payloadDataCurrentSize_ = -1; 160 | } head_; 161 | #pragma pack(pop) 162 | 163 | QByteArray metaData_; 164 | QByteArray payloadData_; 165 | 166 | QString localFilePath_; 167 | 168 | qint32 metaDataOriginalIndex_ = -1; 169 | qint32 metaDataOriginalCurrentSize_ = -1; 170 | qint32 payloadDataOriginalIndex_ = -1; 171 | qint32 payloadDataOriginalCurrentSize_ = -1; 172 | 173 | QVariantMap metaDataInVariantMap_; 174 | }; 175 | 176 | // inc import 177 | #include "jqnetwork_package.inc" 178 | 179 | #endif//JQNETWORK_INCLUDE_JQNETWORK_PACKAGE_H_ 180 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_package.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_PACKAGE_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_PACKAGE_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_package.h" 18 | 19 | inline int JQNetworkPackage::headSize() 20 | { 21 | return sizeof( head_ ); 22 | } 23 | 24 | inline bool JQNetworkPackage::isCompletePackage() const 25 | { 26 | return isCompletePackage_; 27 | } 28 | 29 | inline bool JQNetworkPackage::isAbandonPackage() const 30 | { 31 | return isAbandonPackage_; 32 | } 33 | 34 | inline qint8 JQNetworkPackage::bootFlag() const 35 | { 36 | return head_.bootFlag_; 37 | } 38 | 39 | inline qint8 JQNetworkPackage::packageFlag() const 40 | { 41 | return head_.packageFlag_; 42 | } 43 | 44 | inline qint32 JQNetworkPackage::randomFlag() const 45 | { 46 | return head_.randomFlag_; 47 | } 48 | 49 | inline qint8 JQNetworkPackage::metaDataFlag() const 50 | { 51 | return head_.metaDataFlag_; 52 | } 53 | 54 | inline qint32 JQNetworkPackage::metaDataTotalSize() const 55 | { 56 | return head_.metaDataTotalSize_; 57 | } 58 | 59 | inline qint32 JQNetworkPackage::metaDataCurrentSize() const 60 | { 61 | return head_.metaDataCurrentSize_; 62 | } 63 | 64 | inline qint8 JQNetworkPackage::payloadDataFlag() const 65 | { 66 | return head_.payloadDataFlag_; 67 | } 68 | 69 | inline qint32 JQNetworkPackage::payloadDataTotalSize() const 70 | { 71 | return head_.payloadDataTotalSize_; 72 | } 73 | 74 | inline qint32 JQNetworkPackage::payloadDataCurrentSize() const 75 | { 76 | return head_.payloadDataCurrentSize_; 77 | } 78 | 79 | inline QByteArray JQNetworkPackage::metaData() const 80 | { 81 | return metaData_; 82 | } 83 | 84 | inline int JQNetworkPackage::metaDataSize() const 85 | { 86 | return metaData_.size(); 87 | } 88 | 89 | inline QByteArray JQNetworkPackage::payloadData() const 90 | { 91 | return payloadData_; 92 | } 93 | 94 | inline int JQNetworkPackage::payloadDataSize() const 95 | { 96 | return payloadData_.size(); 97 | } 98 | 99 | inline qint32 JQNetworkPackage::metaDataOriginalIndex() const 100 | { 101 | return metaDataOriginalIndex_; 102 | } 103 | 104 | inline qint32 JQNetworkPackage::metaDataOriginalCurrentSize() const 105 | { 106 | return metaDataOriginalCurrentSize_; 107 | } 108 | 109 | inline qint32 JQNetworkPackage::payloadDataOriginalIndex() const 110 | { 111 | return payloadDataOriginalIndex_; 112 | } 113 | 114 | inline qint32 JQNetworkPackage::payloadDataOriginalCurrentSize() const 115 | { 116 | return payloadDataOriginalCurrentSize_; 117 | } 118 | 119 | inline QVariantMap JQNetworkPackage::metaDataInVariantMap() const 120 | { 121 | return metaDataInVariantMap_; 122 | } 123 | 124 | inline QString JQNetworkPackage::targetActionFlag() const 125 | { 126 | return ( metaDataInVariantMap_.contains( "targetActionFlag" ) ) ? ( metaDataInVariantMap_[ "targetActionFlag" ].toString() ) : ( QString() ); 127 | } 128 | 129 | inline QVariantMap JQNetworkPackage::appendData() const 130 | { 131 | return ( metaDataInVariantMap_.contains( "appendData" ) ) ? ( metaDataInVariantMap_[ "appendData" ].toMap() ) : ( QVariantMap() ); 132 | } 133 | 134 | inline QString JQNetworkPackage::fileName() const 135 | { 136 | return ( metaDataInVariantMap_.contains( "fileName" ) ) ? ( metaDataInVariantMap_[ "fileName" ].toString() ) : ( QString() ); 137 | } 138 | 139 | inline qint64 JQNetworkPackage::fileSize() const 140 | { 141 | return ( metaDataInVariantMap_.contains( "fileSize" ) ) ? ( metaDataInVariantMap_[ "fileSize" ].toLongLong() ) : ( -1 ); 142 | } 143 | 144 | inline qint32 JQNetworkPackage::filePermissions() const 145 | { 146 | return ( metaDataInVariantMap_.contains( "filePermissions" ) ) ? ( metaDataInVariantMap_[ "filePermissions" ].toInt() ) : ( 0 ); 147 | } 148 | 149 | inline bool JQNetworkPackage::containsFile() const 150 | { 151 | return !localFilePath_.isEmpty(); 152 | } 153 | 154 | inline QString JQNetworkPackage::localFilePath() const 155 | { 156 | return localFilePath_; 157 | } 158 | 159 | inline void JQNetworkPackage::setLocalFilePath(const QString &localFilePath) 160 | { 161 | localFilePath_ = localFilePath; 162 | } 163 | 164 | inline void JQNetworkPackage::clearMetaData() 165 | { 166 | metaData_.clear(); 167 | } 168 | 169 | inline void JQNetworkPackage::clearPayloadData() 170 | { 171 | payloadData_.clear(); 172 | } 173 | 174 | inline QByteArray JQNetworkPackage::toByteArray() const 175 | { 176 | QByteArray buffer; 177 | 178 | buffer.append( reinterpret_cast< const char * >( &head_ ), JQNetworkPackage::headSize() ); 179 | if ( head_.metaDataCurrentSize_ > 0 ) 180 | { 181 | buffer.append( metaData_ ); 182 | } 183 | if ( head_.payloadDataCurrentSize_ > 0 ) 184 | { 185 | buffer.append( payloadData_ ); 186 | } 187 | 188 | return buffer; 189 | } 190 | 191 | #endif//JQNETWORK_INCLUDE_JQNETWORK_PACKAGE_INC_ 192 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_processor.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_PROCESSOR_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_PROCESSOR_H_ 15 | 16 | // JQNetwork lib import 17 | #include 18 | 19 | #define JQNP_PRINTFUNCTION() \ 20 | { \ 21 | const auto &&buffer = QString( Q_FUNC_INFO ); \ 22 | const auto &&indexForEnd = buffer.indexOf( '(' ); \ 23 | const auto functionName = buffer.mid( 0, indexForEnd ).remove( QStringLiteral( "bool " ) ); \ 24 | qDebug() << functionName.toLocal8Bit().data(); \ 25 | } 26 | 27 | #define JQNP_PRINTRECEIVED() \ 28 | { \ 29 | const auto &&buffer = QString( Q_FUNC_INFO ); \ 30 | const auto &&indexForEnd = buffer.indexOf( '(' ); \ 31 | const auto functionName = buffer.mid( 0, indexForEnd ).remove( QStringLiteral( "bool " ) ); \ 32 | qDebug() << ( functionName + ": received:" ).toLocal8Bit().data() << received; \ 33 | } 34 | 35 | #define JQNP_SUCCEED() \ 36 | send[ QStringLiteral( "succeed" ) ] = true; \ 37 | send[ QStringLiteral( "message" ) ] = ""; \ 38 | return true; 39 | 40 | #define JQNP_FAIL( errorMessage ) \ 41 | send[ QStringLiteral( "succeed" ) ] = false; \ 42 | send[ QStringLiteral( "message" ) ] = errorMessage; \ 43 | return false; 44 | 45 | #define JQNP_SERVERFAIL( errorMessage ) \ 46 | const auto &&message = QStringLiteral( ": Server error: " ) + errorMessage; \ 47 | qDebug() << QString( Q_FUNC_INFO ).remove( "bool " ).toLocal8Bit().data() \ 48 | << message.toLocal8Bit().data(); \ 49 | send[ QStringLiteral( "succeed" ) ] = false; \ 50 | send[ QStringLiteral( "message" ) ] = errorMessage; \ 51 | return false; 52 | 53 | #define JQNP_CHECKRECEIVEDDATACONTAINS( ... ) \ 54 | if ( \ 55 | !JQNetworkProcessor::checkMapContains( \ 56 | { __VA_ARGS__ }, \ 57 | received, \ 58 | send \ 59 | ) \ 60 | ) \ 61 | { return false; } 62 | 63 | #define JQNP_CHECKRECEIVEDDATACONTAINSANDNOT0( ... ) \ 64 | if ( \ 65 | !JQNetworkProcessor::checkMapContainsAndNot0( \ 66 | { __VA_ARGS__ }, \ 67 | received, \ 68 | send \ 69 | ) \ 70 | ) \ 71 | { return false; } 72 | 73 | #define JQNP_CHECKRECEIVEDDATACONTAINSANDNOTEMPTY( ... ) \ 74 | if ( \ 75 | !JQNetworkProcessor::checkMapContainsAndNotEmpty( \ 76 | { __VA_ARGS__ }, \ 77 | received, \ 78 | send \ 79 | ) \ 80 | ) \ 81 | { return false; } 82 | 83 | #define JQNP_CHECKRECEIVEDDATACONTAINSEXPECTEDCONTENT( key, ... ) \ 84 | if ( \ 85 | !JQNetworkProcessor::checkDataContasinsExpectedContent( \ 86 | key, \ 87 | __VA_ARGS__, \ 88 | received, \ 89 | send \ 90 | ) \ 91 | ) \ 92 | { return false; } 93 | 94 | #define JQNP_CHECKRECEIVEDAPPENDDATACONTAINS( ... ) \ 95 | if ( \ 96 | !JQNetworkProcessor::checkMapContains( \ 97 | { __VA_ARGS__ }, \ 98 | receivedAppend, \ 99 | send \ 100 | ) \ 101 | ) \ 102 | { return false; } 103 | 104 | #define JQNP_CHECKRECEIVEDAPPENDDATACONTAINSANDNOT0( ... ) \ 105 | if ( \ 106 | !JQNetworkProcessor::checkMapContainsAndNot0( \ 107 | { __VA_ARGS__ }, \ 108 | receivedAppend, \ 109 | send \ 110 | ) \ 111 | ) \ 112 | { return false; } 113 | 114 | #define JQNP_CHECKRECEIVEDAPPENDDATACONTAINSANDNOTEMPTY( ... ) \ 115 | if ( \ 116 | !JQNetworkProcessor::checkMapContainsAndNotEmpty( \ 117 | { __VA_ARGS__ }, \ 118 | receivedAppend, \ 119 | send \ 120 | ) \ 121 | ) \ 122 | { return false; } 123 | 124 | #define JQNP_CHECKRECEIVEDAPPENDDATACONTAINSEXPECTEDCONTENT( key, ... ) \ 125 | if ( \ 126 | !JQNetworkProcessor::checkDataContasinsExpectedContent( \ 127 | key, \ 128 | __VA_ARGS__, \ 129 | receivedAppend, \ 130 | send \ 131 | ) \ 132 | ) \ 133 | { return false; } 134 | 135 | class JQNetworkProcessor: public QObject 136 | { 137 | Q_OBJECT 138 | Q_DISABLE_COPY( JQNetworkProcessor ) 139 | 140 | public: 141 | JQNetworkProcessor(const bool &invokeMethodByProcessorThread = false); 142 | 143 | ~JQNetworkProcessor() = default; 144 | 145 | QSet< QString > availableSlots(); 146 | 147 | bool handlePackage(const JQNetworkConnectPointer &connect, const JQNetworkPackageSharedPointer &package); 148 | 149 | void setReceivedPossibleThreads(const QSet< QThread * > &threads); 150 | 151 | static bool checkMapContains(const QStringList &keys, const QVariantMap &received, QVariantMap &send); 152 | 153 | static bool checkMapContainsAndNot0(const QStringList &keys, const QVariantMap &received, QVariantMap &send); 154 | 155 | static bool checkMapContainsAndNotEmpty(const QStringList &keys, const QVariantMap &received, QVariantMap &send); 156 | 157 | static bool checkDataContasinsExpectedContent(const QString &key, const QVariantList &expectedContentList, const QVariantMap &received, QVariantMap &send); 158 | 159 | protected: 160 | JQNetworkConnectPointer currentThreadConnect(); 161 | 162 | private: 163 | inline static void deleteByteArray(QByteArray *ptr); 164 | 165 | inline static void deleteVariantMap(QVariantMap *ptr); 166 | 167 | static void deleteFileInfo(QFileInfo *ptr); 168 | 169 | private: 170 | static QSet< QString > exceptionSlots_; 171 | 172 | bool invokeMethodByProcessorThread_; 173 | 174 | QSet< QString > availableSlots_; 175 | QMap< QThread *, JQNetworkConnectPointer > connectMapByThread_; 176 | 177 | QMap< QString, std::function > onpackageReceivedCallbacks_; 178 | }; 179 | 180 | // inc import 181 | #include "jqnetwork_processor.inc" 182 | 183 | #endif//JQNETWORK_INCLUDE_JQNETWORK_PROCESSOR_H_ 184 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_processor.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_PROCESSOR_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_PROCESSOR_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_processor.h" 18 | 19 | inline void JQNetworkProcessor::deleteByteArray(QByteArray *ptr) 20 | { 21 | delete ptr; 22 | } 23 | 24 | inline void JQNetworkProcessor::deleteVariantMap(QVariantMap *ptr) 25 | { 26 | delete ptr; 27 | } 28 | 29 | #endif//JQNETWORK_INCLUDE_JQNETWORK_PROCESSOR_INC_ 30 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_server.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_SERVER_H_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_SERVER_H_ 15 | 16 | // JQNetwork lib import 17 | #include 18 | 19 | struct JQNetworkServerSettings 20 | { 21 | QString dutyMark; 22 | 23 | QHostAddress listenAddress = QHostAddress::Any; 24 | quint16 listenPort = 0; 25 | 26 | std::function< void( const JQNetworkConnectPointer & ) > connectToHostErrorCallback = nullptr; 27 | std::function< void( const JQNetworkConnectPointer & ) > connectToHostTimeoutCallback = nullptr; 28 | std::function< void( const JQNetworkConnectPointer & ) > connectToHostSucceedCallback = nullptr; 29 | std::function< void( const JQNetworkConnectPointer & ) > remoteHostClosedCallback = nullptr; 30 | std::function< void( const JQNetworkConnectPointer & ) > readyToDeleteCallback = nullptr; 31 | std::function< void( const JQNetworkConnectPointer &, const qint32 &, const qint64 &, const qint64 &, const qint64 & ) > packageSendingCallback = nullptr; 32 | std::function< void( const JQNetworkConnectPointer &, const qint32 &, const qint64 &, const qint64 &, const qint64 & ) > packageReceivingCallback = nullptr; 33 | std::function< void( const JQNetworkConnectPointer &, const JQNetworkPackageSharedPointer & ) > packageReceivedCallback = nullptr; 34 | 35 | int globalServerThreadCount = 1; 36 | int globalSocketThreadCount = JQNETWORK_ADVISE_THREADCOUNT; 37 | int globalCallbackThreadCount = JQNETWORK_ADVISE_THREADCOUNT; 38 | }; 39 | 40 | class JQNetworkServer: public QObject 41 | { 42 | Q_OBJECT 43 | Q_DISABLE_COPY( JQNetworkServer ) 44 | 45 | public: 46 | JQNetworkServer( 47 | const JQNetworkServerSettingsSharedPointer serverSettings, 48 | const JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings, 49 | const JQNetworkConnectSettingsSharedPointer connectSettings 50 | ); 51 | 52 | ~JQNetworkServer(); 53 | 54 | static JQNetworkServerSharedPointer createServer( 55 | const quint16 &listenPort, 56 | const QHostAddress &listenAddress = QHostAddress::Any, 57 | const bool &fileTransferEnabled = false 58 | ); 59 | 60 | inline JQNetworkServerSettingsSharedPointer serverSettings(); 61 | 62 | inline JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings(); 63 | 64 | inline JQNetworkConnectSettingsSharedPointer connectSettings(); 65 | 66 | inline QString nodeMarkSummary() const; 67 | 68 | bool begin(); 69 | 70 | void registerProcessor(const JQNetworkProcessorPointer &processor); 71 | 72 | inline QSet< QString > availableProcessorMethodNames() const; 73 | 74 | private: 75 | void incomingConnection(const qintptr &socketDescriptor); 76 | 77 | inline void onConnectToHostError(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &connectPool); 78 | 79 | inline void onConnectToHostTimeout(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &connectPool); 80 | 81 | inline void onConnectToHostSucceed(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &connectPool); 82 | 83 | inline void onRemoteHostClosed(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &connectPool); 84 | 85 | inline void onReadyToDelete(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &connectPool); 86 | 87 | inline void onPackageSending( 88 | const JQNetworkConnectPointer &connect, 89 | const JQNetworkConnectPoolPointer &connectPool, 90 | const qint32 &randomFlag, 91 | const qint64 &payloadCurrentIndex, 92 | const qint64 &payloadCurrentSize, 93 | const qint64 &payloadTotalSize 94 | ); 95 | 96 | inline void onPackageReceiving( 97 | const JQNetworkConnectPointer &connect, 98 | const JQNetworkConnectPoolPointer &connectPool, 99 | const qint32 &randomFlag, 100 | const qint64 &payloadCurrentIndex, 101 | const qint64 &payloadCurrentSize, 102 | const qint64 &payloadTotalSize 103 | ); 104 | 105 | void onPackageReceived( 106 | const JQNetworkConnectPointer &connect, 107 | const JQNetworkConnectPoolPointer &connectPool, 108 | const JQNetworkPackageSharedPointer &package 109 | ); 110 | 111 | private: 112 | // Thread pool 113 | static QWeakPointer< JQNetworkThreadPool > globalServerThreadPool_; 114 | QSharedPointer< JQNetworkThreadPool > serverThreadPool_; 115 | static QWeakPointer< JQNetworkThreadPool > globalSocketThreadPool_; 116 | QSharedPointer< JQNetworkThreadPool > socketThreadPool_; 117 | static QWeakPointer< JQNetworkThreadPool > globalCallbackThreadPool_; 118 | QSharedPointer< JQNetworkThreadPool > callbackThreadPool_; 119 | 120 | // Settings 121 | JQNetworkServerSettingsSharedPointer serverSettings_; 122 | JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings_; 123 | JQNetworkConnectSettingsSharedPointer connectSettings_; 124 | 125 | // Server 126 | QSharedPointer< QTcpServer > tcpServer_; 127 | QMap< QThread *, JQNetworkConnectPoolSharedPointer > connectPools_; 128 | 129 | // Processor 130 | QSet< JQNetworkProcessor * > processors_; 131 | QMap< QString, std::function< void( const JQNetworkConnectPointer &, const JQNetworkPackageSharedPointer & ) > > processorCallbacks_; 132 | 133 | // Other 134 | QString nodeMarkSummary_; 135 | }; 136 | 137 | // inc import 138 | #include "jqnetwork_server.inc" 139 | 140 | #endif//JQNETWORK_INCLUDE_JQNETWORK_SERVER_H_ 141 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/include/jqnetwork_server.inc: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #ifndef JQNETWORK_INCLUDE_JQNETWORK_SERVER_INC_ 14 | #define JQNETWORK_INCLUDE_JQNETWORK_SERVER_INC_ 15 | 16 | // JQNetwork lib import 17 | #include "jqnetwork_server.h" 18 | 19 | inline JQNetworkServerSettingsSharedPointer JQNetworkServer::serverSettings() 20 | { 21 | return serverSettings_; 22 | } 23 | 24 | inline JQNetworkConnectPoolSettingsSharedPointer JQNetworkServer::connectPoolSettings() 25 | { 26 | return connectPoolSettings_; 27 | } 28 | 29 | inline JQNetworkConnectSettingsSharedPointer JQNetworkServer::connectSettings() 30 | { 31 | return connectSettings_; 32 | } 33 | 34 | inline QString JQNetworkServer::nodeMarkSummary() const 35 | { 36 | return nodeMarkSummary_; 37 | } 38 | 39 | inline QSet< QString > JQNetworkServer::availableProcessorMethodNames() const 40 | { 41 | return QSet< QString >::fromList( processorCallbacks_.keys() ); 42 | } 43 | 44 | inline void JQNetworkServer::onConnectToHostError(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &) 45 | { 46 | if ( !serverSettings_->connectToHostErrorCallback ) { return; } 47 | 48 | callbackThreadPool_->run( 49 | [ 50 | connect, 51 | callback = serverSettings_->connectToHostErrorCallback 52 | ]() 53 | { 54 | callback( connect ); 55 | } 56 | ); 57 | } 58 | 59 | inline void JQNetworkServer::onConnectToHostTimeout(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &) 60 | { 61 | if ( !serverSettings_->connectToHostTimeoutCallback ) { return; } 62 | 63 | callbackThreadPool_->run( 64 | [ 65 | connect, 66 | callback = serverSettings_->connectToHostTimeoutCallback 67 | ]() 68 | { 69 | callback( connect ); 70 | } 71 | ); 72 | } 73 | 74 | inline void JQNetworkServer::onConnectToHostSucceed(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &) 75 | { 76 | if ( !serverSettings_->connectToHostSucceedCallback ) { return; } 77 | 78 | callbackThreadPool_->run( 79 | [ 80 | connect, 81 | callback = serverSettings_->connectToHostSucceedCallback 82 | ]() 83 | { 84 | callback( connect ); 85 | } 86 | ); 87 | } 88 | 89 | inline void JQNetworkServer::onRemoteHostClosed(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &) 90 | { 91 | if ( !serverSettings_->remoteHostClosedCallback ) { return; } 92 | 93 | callbackThreadPool_->run( 94 | [ 95 | connect, 96 | callback = serverSettings_->remoteHostClosedCallback 97 | ]() 98 | { 99 | callback( connect ); 100 | } 101 | ); 102 | } 103 | 104 | inline void JQNetworkServer::onReadyToDelete(const JQNetworkConnectPointer &connect, const JQNetworkConnectPoolPointer &) 105 | { 106 | if ( !serverSettings_->readyToDeleteCallback ) { return; } 107 | 108 | callbackThreadPool_->run( 109 | [ 110 | connect, 111 | callback = serverSettings_->readyToDeleteCallback 112 | ]() 113 | { 114 | callback( connect ); 115 | } 116 | ); 117 | } 118 | 119 | inline void JQNetworkServer::onPackageSending( 120 | const JQNetworkConnectPointer &connect, 121 | const JQNetworkConnectPoolPointer &, 122 | const qint32 &randomFlag, 123 | const qint64 &payloadCurrentIndex, 124 | const qint64 &payloadCurrentSize, 125 | const qint64 &payloadTotalSize 126 | ) 127 | { 128 | if ( !serverSettings_->packageSendingCallback ) { return; } 129 | 130 | callbackThreadPool_->run( 131 | [ 132 | connect, 133 | callback = serverSettings_->packageSendingCallback, 134 | randomFlag, 135 | payloadCurrentIndex, 136 | payloadCurrentSize, 137 | payloadTotalSize 138 | ]() 139 | { 140 | callback( connect, randomFlag, payloadCurrentIndex, payloadCurrentSize, payloadTotalSize ); 141 | } 142 | ); 143 | } 144 | 145 | inline void JQNetworkServer::onPackageReceiving( 146 | const JQNetworkConnectPointer &connect, 147 | const JQNetworkConnectPoolPointer &, 148 | const qint32 &randomFlag, 149 | const qint64 &payloadCurrentIndex, 150 | const qint64 &payloadCurrentSize, 151 | const qint64 &payloadTotalSize 152 | ) 153 | { 154 | if ( !serverSettings_->packageReceivingCallback ) { return; } 155 | 156 | callbackThreadPool_->run( 157 | [ 158 | connect, 159 | callback = serverSettings_->packageReceivingCallback, 160 | randomFlag, 161 | payloadCurrentIndex, 162 | payloadCurrentSize, 163 | payloadTotalSize 164 | ]() 165 | { 166 | callback( connect, randomFlag, payloadCurrentIndex, payloadCurrentSize, payloadTotalSize ); 167 | } 168 | ); 169 | } 170 | 171 | #endif//JQNETWORK_INCLUDE_JQNETWORK_SERVER_INC_ 172 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/qml/JQNetwork/JQNetworkClient.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.8 2 | import JQNetworkClientForQml 1.0 3 | 4 | JQNetworkClientForQml { 5 | id: jqNetworkClientForQml 6 | 7 | function onSendSucceed( callback, received ) { 8 | callback( received ); 9 | } 10 | 11 | function onSendFail( callback ) { 12 | callback(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/qml/JQNetwork/qmldir: -------------------------------------------------------------------------------- 1 | module JQNetwork 2 | 3 | JQNetworkClient 1.0 JQNetworkClient.qml 4 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/qml/JQNetworkQml.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | JQNetwork/JQNetworkClient.qml 4 | JQNetwork/qmldir 5 | 6 | 7 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/src/jqnetwork_clientforqml.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_clientforqml.h" 14 | 15 | // Qt lib import 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | // JQNetwork lib import 22 | #include 23 | #include 24 | #include 25 | 26 | using namespace std; 27 | using namespace std::placeholders; 28 | 29 | JQNetworkClientForQml::JQNetworkClientForQml() 30 | { 31 | static bool flag = true; 32 | if ( flag ) 33 | { 34 | flag = false; 35 | qRegisterMetaType< std::function >( "std::function" ); 36 | qRegisterMetaType< QVariantMap >( "QVariantMap" ); 37 | } 38 | } 39 | 40 | bool JQNetworkClientForQml::beginClient() 41 | { 42 | jqNetworkClient_ = JQNetworkClient::createClient(); 43 | 44 | jqNetworkClient_->clientSettings()->connectToHostErrorCallback = std::bind( &JQNetworkClientForQml::connectToHostError, this, _2, _3 ); 45 | jqNetworkClient_->clientSettings()->connectToHostTimeoutCallback = std::bind( &JQNetworkClientForQml::connectToHostTimeout, this, _2, _3 ); 46 | jqNetworkClient_->clientSettings()->connectToHostSucceedCallback = std::bind( &JQNetworkClientForQml::connectToHostSucceed, this, _2, _3 ); 47 | jqNetworkClient_->clientSettings()->remoteHostClosedCallback = std::bind( &JQNetworkClientForQml::remoteHostClosed, this, _2, _3 ); 48 | jqNetworkClient_->clientSettings()->readyToDeleteCallback = std::bind( &JQNetworkClientForQml::readyToDelete, this, _2, _3 ); 49 | 50 | return jqNetworkClient_->begin(); 51 | } 52 | 53 | void JQNetworkClientForQml::createConnect(const QString &hostName, const quint16 &port) 54 | { 55 | jqNetworkClient_->createConnect( hostName, port ); 56 | } 57 | 58 | void JQNetworkClientForQml::sendVariantMapData( 59 | const QString &hostName, 60 | const quint16 &port, 61 | const QString &targetActionFlag, 62 | const QVariantMap &payloadData, 63 | QJSValue succeedCallback, 64 | QJSValue failCallback 65 | ) 66 | { 67 | if ( !succeedCallback.isCallable() ) 68 | { 69 | qDebug() << "JQNetworkClientForQml::sendPayloadData: error, succeedCallback not callable"; 70 | return; 71 | } 72 | 73 | if ( !failCallback.isCallable() ) 74 | { 75 | qDebug() << "JQNetworkClientForQml::sendPayloadData: error, failCallback not callable"; 76 | return; 77 | } 78 | 79 | if ( !jqNetworkClient_ ) 80 | { 81 | qDebug() << "JQNetworkClientForQml::sendPayloadData: error, client need beginClient"; 82 | return; 83 | } 84 | 85 | jqNetworkClient_->sendVariantMapData( 86 | hostName, 87 | port, 88 | targetActionFlag, 89 | payloadData, 90 | { }, // empty appendData 91 | [ this, succeedCallback ](const auto &, const auto &package) 92 | { 93 | const auto &&received = QJsonDocument::fromJson( package->payloadData() ).object().toVariantMap(); 94 | 95 | QMetaObject::invokeMethod( 96 | this, 97 | "onSendSucceed", 98 | Qt::QueuedConnection, 99 | Q_ARG( QVariant, QVariant::fromValue( succeedCallback ) ), 100 | Q_ARG( QVariant, received ) 101 | ); 102 | }, 103 | [ this, failCallback ](const auto &) 104 | { 105 | QMetaObject::invokeMethod( 106 | this, 107 | "received", 108 | Qt::QueuedConnection, 109 | Q_ARG( QVariant, QVariant::fromValue( failCallback ) ) 110 | ); 111 | } 112 | ); 113 | } 114 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/src/jqnetwork_connectpool.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_connectpool.h" 14 | 15 | // Qt lib import 16 | #include 17 | #include 18 | 19 | // JQNetwork lib import 20 | #include 21 | 22 | using namespace std; 23 | using namespace std::placeholders; 24 | 25 | JQNetworkConnectPool::JQNetworkConnectPool( 26 | JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings, 27 | JQNetworkConnectSettingsSharedPointer connectSettings 28 | ): 29 | connectPoolSettings_( connectPoolSettings ), 30 | connectSettings_( connectSettings ) 31 | { 32 | connectSettings_->connectToHostErrorCallback = bind( &JQNetworkConnectPool::onConnectToHostError, this, _1 ); 33 | connectSettings_->connectToHostTimeoutCallback = bind( &JQNetworkConnectPool::onConnectToHostTimeout, this, _1 ); 34 | connectSettings_->connectToHostSucceedCallback = bind( &JQNetworkConnectPool::onConnectToHostSucceed, this, _1 ); 35 | connectSettings_->remoteHostClosedCallback = bind( &JQNetworkConnectPool::onRemoteHostClosed, this, _1 ); 36 | connectSettings_->readyToDeleteCallback = bind( &JQNetworkConnectPool::onReadyToDelete, this, _1 ); 37 | connectSettings_->packageSendingCallback = bind( &JQNetworkConnectPool::onPackageSending, this, _1, _2, _3, _4, _5 ); 38 | connectSettings_->packageReceivingCallback = bind( &JQNetworkConnectPool::onPackageReceiving, this, _1, _2, _3, _4, _5 ); 39 | connectSettings_->packageReceivedCallback = bind( &JQNetworkConnectPool::onPackageReceived, this, _1, _2 ); 40 | connectSettings_->waitReplyPackageSucceedCallback = bind( &JQNetworkConnectPool::onWaitReplyPackageSucceed, this, _1, _2, _3 ); 41 | connectSettings_->waitReplyPackageFailCallback = bind( &JQNetworkConnectPool::onWaitReplyPackageFail, this, _1, _2 ); 42 | } 43 | 44 | JQNetworkConnectPool::~JQNetworkConnectPool() 45 | { 46 | QVector< JQNetworkConnectSharedPointer > waitForCloseConnects; 47 | 48 | for ( const auto &connect: connectForConnecting_ ) 49 | { 50 | waitForCloseConnects.push_back( connect ); 51 | } 52 | 53 | for ( const auto &connect: connectForConnected_ ) 54 | { 55 | waitForCloseConnects.push_back( connect ); 56 | } 57 | 58 | for ( const auto &connect: waitForCloseConnects ) 59 | { 60 | connect->close(); 61 | } 62 | } 63 | 64 | void JQNetworkConnectPool::createConnect( 65 | const std::function< void( std::function< void() > ) > runOnConnectThreadCallback, 66 | const QString &hostName, 67 | const quint16 &port 68 | ) 69 | { 70 | auto connectKey = QString( "%1:%2" ).arg( hostName ).arg( port ); 71 | 72 | mutex_.lock(); 73 | 74 | if ( bimapForHostAndPort1.contains( connectKey ) ) 75 | { 76 | mutex_.unlock(); 77 | 78 | return; 79 | } 80 | 81 | mutex_.unlock(); 82 | 83 | JQNetworkConnect::createConnect( 84 | [ 85 | this, 86 | connectKey, 87 | hostName 88 | ](const auto &connect) 89 | { 90 | this->mutex_.lock(); 91 | 92 | this->connectForConnecting_[ connect.data() ] = connect; 93 | this->bimapForHostAndPort1[ connectKey ] = connect.data(); 94 | this->bimapForHostAndPort2[ connect.data() ] = connectKey; 95 | 96 | this->mutex_.unlock(); 97 | }, 98 | runOnConnectThreadCallback, 99 | connectSettings_, 100 | hostName, 101 | port 102 | ); 103 | } 104 | 105 | void JQNetworkConnectPool::createConnect( 106 | const std::function< void( std::function< void() > ) > runOnConnectThreadCallback, 107 | const qintptr &socketDescriptor 108 | ) 109 | { 110 | mutex_.lock(); 111 | 112 | if ( bimapForSocketDescriptor1.contains( socketDescriptor ) ) 113 | { 114 | mutex_.unlock(); 115 | 116 | return; 117 | } 118 | 119 | mutex_.unlock(); 120 | 121 | JQNetworkConnect::createConnect( 122 | [ 123 | this, 124 | socketDescriptor 125 | ](const auto &connect) 126 | { 127 | this->mutex_.lock(); 128 | 129 | this->connectForConnecting_[ connect.data() ] = connect; 130 | this->bimapForSocketDescriptor1[ socketDescriptor ] = connect.data(); 131 | this->bimapForSocketDescriptor2[ connect.data() ] = socketDescriptor; 132 | 133 | this->mutex_.unlock(); 134 | }, 135 | runOnConnectThreadCallback, 136 | connectSettings_, 137 | socketDescriptor 138 | ); 139 | } 140 | 141 | QPair< QString, quint16 > JQNetworkConnectPool::getHostAndPortByConnect(const JQNetworkConnectPointer &connect) 142 | { 143 | QPair< QString, quint16 > reply; 144 | 145 | mutex_.lock(); 146 | 147 | { 148 | auto it = bimapForHostAndPort2.find( connect.data() ); 149 | if ( it != bimapForHostAndPort2.end() ) 150 | { 151 | auto index = it.value().lastIndexOf( ":" ); 152 | 153 | if ( ( index > 0 ) && ( ( index + 1 ) < it.value().size() ) ) 154 | { 155 | reply.first = it.value().mid( 0, index ); 156 | reply.second = it.value().mid( index + 1 ).toUShort(); 157 | } 158 | } 159 | } 160 | 161 | mutex_.unlock(); 162 | 163 | return reply; 164 | } 165 | 166 | qintptr JQNetworkConnectPool::getSocketDescriptorByConnect(const JQNetworkConnectPointer &connect) 167 | { 168 | qintptr reply = { }; 169 | 170 | mutex_.lock(); 171 | 172 | { 173 | auto it = bimapForSocketDescriptor2.find( connect.data() ); 174 | if ( it != bimapForSocketDescriptor2.end() ) 175 | { 176 | reply = it.value(); 177 | } 178 | } 179 | 180 | mutex_.unlock(); 181 | 182 | return reply; 183 | } 184 | 185 | JQNetworkConnectPointer JQNetworkConnectPool::getConnectByHostAndPort(const QString &hostName, const quint16 &port) 186 | { 187 | JQNetworkConnectPointer reply; 188 | 189 | mutex_.lock(); 190 | 191 | { 192 | auto it = bimapForHostAndPort1.find( QString( "%1:%2" ).arg( hostName, QString::number( port ) ) ); 193 | if ( it != bimapForHostAndPort1.end() ) 194 | { 195 | reply = it.value(); 196 | } 197 | } 198 | 199 | mutex_.unlock(); 200 | 201 | return reply; 202 | } 203 | 204 | JQNetworkConnectPointer JQNetworkConnectPool::getConnectBySocketDescriptor(const qintptr &socketDescriptor) 205 | { 206 | JQNetworkConnectPointer reply; 207 | 208 | mutex_.lock(); 209 | 210 | { 211 | auto it = bimapForSocketDescriptor1.find( socketDescriptor ); 212 | if ( it != bimapForSocketDescriptor1.end() ) 213 | { 214 | reply = it.value(); 215 | } 216 | } 217 | 218 | mutex_.unlock(); 219 | 220 | return reply; 221 | } 222 | 223 | void JQNetworkConnectPool::onConnectToHostSucceed(const JQNetworkConnectPointer &connect) 224 | { 225 | // qDebug() << "JQNetworkConnectPool::onConnectToHostSucceed:" << connect.data(); 226 | 227 | mutex_.lock(); 228 | 229 | auto containsInConnecting = connectForConnecting_.contains( connect.data() ); 230 | 231 | if ( !containsInConnecting ) 232 | { 233 | mutex_.unlock(); 234 | 235 | qDebug() << "JQNetworkConnectPool::onConnectToHostSucceed: error: connect not contains" << connect.data(); 236 | return; 237 | } 238 | 239 | connectForConnected_[ connect.data() ] = connectForConnecting_[ connect.data() ]; 240 | connectForConnecting_.remove( connect.data() ); 241 | 242 | mutex_.unlock(); 243 | 244 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->connectToHostSucceedCallback ); 245 | connectPoolSettings_->connectToHostSucceedCallback( connect, this ); 246 | } 247 | 248 | void JQNetworkConnectPool::onReadyToDelete(const JQNetworkConnectPointer &connect) 249 | { 250 | // qDebug() << "JQNetworkConnectPool::onReadyToDelete:" << connect.data(); 251 | 252 | JQNETWORK_NULLPTR_CHECK( connectPoolSettings_->readyToDeleteCallback ); 253 | connectPoolSettings_->readyToDeleteCallback( connect, this ); 254 | 255 | mutex_.lock(); 256 | 257 | auto containsInConnecting = connectForConnecting_.contains( connect.data() ); 258 | auto containsInConnected = connectForConnected_.contains( connect.data() ); 259 | auto containsInBimapForHostAndPort = bimapForHostAndPort2.contains( connect.data() ); 260 | auto containsInBimapForSocketDescriptor = bimapForSocketDescriptor2.contains( connect.data() ); 261 | 262 | if ( ( !containsInConnecting && !containsInConnected ) || ( !containsInBimapForHostAndPort && !containsInBimapForSocketDescriptor ) ) 263 | { 264 | mutex_.unlock(); 265 | 266 | qDebug() << "JQNetworkConnectPool::onReadyToDelete: error: connect not contains" << connect.data(); 267 | return; 268 | } 269 | 270 | if ( containsInConnecting ) 271 | { 272 | QTimer::singleShot( 0, [ connect = connectForConnecting_[ connect.data() ] ](){} ); 273 | connectForConnecting_.remove( connect.data() ); 274 | } 275 | 276 | if ( containsInConnected ) 277 | { 278 | QTimer::singleShot( 0, [ connect = connectForConnected_[ connect.data() ] ](){} ); 279 | connectForConnected_.remove( connect.data() ); 280 | } 281 | 282 | if ( containsInBimapForHostAndPort ) 283 | { 284 | bimapForHostAndPort1.remove( bimapForHostAndPort2[ connect.data() ] ); 285 | bimapForHostAndPort2.remove( connect.data() ); 286 | } 287 | 288 | if ( containsInBimapForSocketDescriptor ) 289 | { 290 | bimapForSocketDescriptor1.remove( bimapForSocketDescriptor2[ connect.data() ] ); 291 | bimapForSocketDescriptor2.remove( connect.data() ); 292 | } 293 | 294 | mutex_.unlock(); 295 | } 296 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/src/jqnetwork_foundation.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_foundation.h" 14 | 15 | // Qt lib import 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | 26 | // JQNetworkThreadPoolHelper 27 | JQNetworkThreadPoolHelper::JQNetworkThreadPoolHelper(): 28 | waitForRunCallbacks_( new std::vector< std::function< void() > > ) 29 | { } 30 | 31 | void JQNetworkThreadPoolHelper::run(const std::function< void() > &callback) 32 | { 33 | mutex_.lock(); 34 | 35 | waitForRunCallbacks_->push_back( callback ); 36 | 37 | if ( !alreadyCall_ ) 38 | { 39 | alreadyCall_ = true; 40 | QMetaObject::invokeMethod( 41 | this, 42 | "onRun", 43 | Qt::QueuedConnection 44 | ); 45 | } 46 | 47 | mutex_.unlock(); 48 | } 49 | 50 | void JQNetworkThreadPoolHelper::onRun() 51 | { 52 | auto currentTime = QDateTime::currentMSecsSinceEpoch(); 53 | 54 | if ( ( ( currentTime - lastRunTime_ ) < 5 ) && ( lastRunCallbackCount_ > 10 ) ) 55 | { 56 | QThread::msleep( 5 ); 57 | } 58 | 59 | std::vector< std::function< void() > > callbacks; 60 | 61 | mutex_.lock(); 62 | 63 | callbacks = *waitForRunCallbacks_; 64 | waitForRunCallbacks_->clear(); 65 | 66 | alreadyCall_ = false; 67 | 68 | lastRunTime_ = currentTime; 69 | lastRunCallbackCount_ = static_cast< int >( callbacks.size() ); 70 | 71 | mutex_.unlock(); 72 | 73 | for ( const auto &callback: callbacks ) 74 | { 75 | callback(); 76 | } 77 | } 78 | 79 | // JQNetworkThreadPool 80 | JQNetworkThreadPool::JQNetworkThreadPool(const int &threadCount): 81 | threadPool_( new QThreadPool ), 82 | eventLoops_( new QVector< QPointer< QEventLoop > > ), 83 | helpers_( new QVector< QPointer< JQNetworkThreadPoolHelper > > ) 84 | { 85 | threadPool_->setMaxThreadCount( threadCount ); 86 | eventLoops_->resize( threadCount ); 87 | helpers_->resize( threadCount ); 88 | 89 | QSemaphore semaphoreForThreadStart; 90 | 91 | for ( auto index = 0; index < threadCount; ++index ) 92 | { 93 | QtConcurrent::run( 94 | threadPool_.data(), 95 | [ 96 | this, 97 | index, 98 | &semaphoreForThreadStart 99 | ]() 100 | { 101 | QEventLoop eventLoop; 102 | JQNetworkThreadPoolHelper helper; 103 | 104 | ( *this->eventLoops_ )[ index ] = &eventLoop; 105 | ( *this->helpers_ )[ index ] = &helper; 106 | 107 | semaphoreForThreadStart.release( 1 ); 108 | eventLoop.exec(); 109 | } 110 | ); 111 | } 112 | 113 | semaphoreForThreadStart.acquire( threadCount ); 114 | } 115 | 116 | JQNetworkThreadPool::~JQNetworkThreadPool() 117 | { 118 | for ( const auto &eventLoop: *eventLoops_ ) 119 | { 120 | QMetaObject::invokeMethod( eventLoop.data(), "quit" ); 121 | } 122 | 123 | threadPool_->waitForDone(); 124 | } 125 | 126 | int JQNetworkThreadPool::run(const std::function< void() > &callback, const int &threadIndex) 127 | { 128 | if ( threadIndex == -1 ) 129 | { 130 | rotaryIndex_ = ( rotaryIndex_ + 1 ) % helpers_->size(); 131 | } 132 | 133 | const auto index = ( threadIndex == -1 ) ? ( rotaryIndex_ ) : ( threadIndex ); 134 | 135 | ( *helpers_ )[ index ]->run( callback ); 136 | 137 | return index; 138 | } 139 | 140 | int JQNetworkThreadPool::waitRun(const std::function &callback, const int &threadIndex) 141 | { 142 | QSemaphore semaphore; 143 | 144 | auto index = this->run( 145 | [ 146 | &semaphore, 147 | &callback 148 | ]() 149 | { 150 | callback(); 151 | semaphore.release( 1 ); 152 | }, 153 | threadIndex 154 | ); 155 | 156 | semaphore.acquire( 1 ); 157 | 158 | return index; 159 | } 160 | 161 | // JQNetworkNodeMark 162 | qint64 JQNetworkNodeMark::applicationStartTime_ = QDateTime::currentMSecsSinceEpoch(); 163 | QString JQNetworkNodeMark::applicationFilePath_; 164 | QString JQNetworkNodeMark::localHostName_; 165 | 166 | JQNetworkNodeMark::JQNetworkNodeMark(const QString &dutyMark): 167 | nodeMarkCreatedTime_( QDateTime::currentMSecsSinceEpoch() ), 168 | nodeMarkClassAddress_( QString::number( reinterpret_cast< qint64 >( this ), 16 ) ), 169 | dutyMark_( dutyMark ) 170 | { 171 | if ( applicationFilePath_.isEmpty() ) 172 | { 173 | applicationFilePath_ = qApp->applicationFilePath(); 174 | localHostName_ = QHostInfo::localHostName(); 175 | } 176 | 177 | nodeMarkSummary_ = QCryptographicHash::hash( 178 | QString( "%1:%2:%3:%4:%5:%6" ).arg( 179 | QString::number( applicationStartTime_ ), 180 | applicationFilePath_, 181 | localHostName_, 182 | QString::number( nodeMarkCreatedTime_ ), 183 | nodeMarkClassAddress_, 184 | dutyMark_ 185 | ).toUtf8(), 186 | QCryptographicHash::Md5 187 | ).toHex(); 188 | } 189 | 190 | QString JQNetworkNodeMark::calculateNodeMarkSummary(const QString &dutyMark) 191 | { 192 | JQNetworkNodeMark nodeMark( dutyMark ); 193 | return nodeMark.nodeMarkSummary(); 194 | } 195 | 196 | // JQNetwork 197 | void JQNetwork::printVersionInformation(const char *jqNetworkCompileModeString) 198 | { 199 | qDebug() << "JQNetwork library version:" << JQNETWORK_VERSIONNUMBER.toString().toLatin1().data() 200 | #ifdef __STDC__ 201 | << ", build in:" << QDateTime( 202 | QLocale( QLocale::English ).toDate( QString( __DATE__ ).replace( " ", " 0" ), "MMM dd yyyy"), 203 | QTime::fromString( __TIME__, "hh:mm:ss" ) 204 | ).toString( "yyyy-MM-dd hh:mm:ss" ).toLatin1().data() 205 | #endif 206 | << ", compile mode:" << jqNetworkCompileModeString; 207 | } 208 | -------------------------------------------------------------------------------- /sharedlibrary/JQNetwork/src/jqnetwork_server.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of JQNetwork 3 | 4 | Library introduce: https://github.com/188080501/JQNetwork 5 | 6 | Copyright: Jason 7 | 8 | Contact email: Jason@JasonServer.com 9 | 10 | GitHub: https://github.com/188080501/ 11 | */ 12 | 13 | #include "jqnetwork_server.h" 14 | 15 | // Qt lib import 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | // JQNetwork lib import 22 | #include 23 | #include 24 | #include 25 | #include 26 | 27 | using namespace std; 28 | using namespace std::placeholders; 29 | 30 | // JQNetworkServerHelper 31 | class JQNetworkServerHelper: public QTcpServer 32 | { 33 | public: 34 | JQNetworkServerHelper(const std::function< void(qintptr socketDescriptor) > &onIncomingConnectionCallback): 35 | onIncomingConnectionCallback_( onIncomingConnectionCallback ) 36 | { } 37 | 38 | ~JQNetworkServerHelper() = default; 39 | 40 | private: 41 | inline void incomingConnection(qintptr socketDescriptor) 42 | { 43 | onIncomingConnectionCallback_( socketDescriptor ); 44 | } 45 | 46 | private: 47 | std::function< void(qintptr socketDescriptor) > onIncomingConnectionCallback_; 48 | }; 49 | 50 | // JQNetworkServer 51 | QWeakPointer< JQNetworkThreadPool > JQNetworkServer::globalServerThreadPool_; 52 | QWeakPointer< JQNetworkThreadPool > JQNetworkServer::globalSocketThreadPool_; 53 | QWeakPointer< JQNetworkThreadPool > JQNetworkServer::globalCallbackThreadPool_; 54 | 55 | JQNetworkServer::JQNetworkServer( 56 | const JQNetworkServerSettingsSharedPointer serverSettings, 57 | const JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings, 58 | const JQNetworkConnectSettingsSharedPointer connectSettings 59 | ): 60 | serverSettings_( serverSettings ), 61 | connectPoolSettings_( connectPoolSettings ), 62 | connectSettings_( connectSettings ) 63 | { } 64 | 65 | JQNetworkServer::~JQNetworkServer() 66 | { 67 | if ( !this->tcpServer_ ) { return; } 68 | 69 | serverThreadPool_->waitRun( 70 | [ 71 | this 72 | ]() 73 | { 74 | tcpServer_->close(); 75 | tcpServer_.clear(); 76 | } 77 | ); 78 | 79 | socketThreadPool_->waitRunEach( 80 | [ & ]() 81 | { 82 | connectPools_[ QThread::currentThread() ].clear(); 83 | } 84 | ); 85 | } 86 | 87 | JQNetworkServerSharedPointer JQNetworkServer::createServer( 88 | const quint16 &listenPort, 89 | const QHostAddress &listenAddress, 90 | const bool &fileTransferEnabled 91 | ) 92 | { 93 | JQNetworkServerSettingsSharedPointer serverSettings( new JQNetworkServerSettings ); 94 | JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings( new JQNetworkConnectPoolSettings ); 95 | JQNetworkConnectSettingsSharedPointer connectSettings( new JQNetworkConnectSettings ); 96 | 97 | serverSettings->listenAddress = listenAddress; 98 | serverSettings->listenPort = listenPort; 99 | 100 | if ( fileTransferEnabled ) 101 | { 102 | connectSettings->fileTransferEnabled = true; 103 | connectSettings->setFilePathProviderToDefaultDir(); 104 | } 105 | 106 | return JQNetworkServerSharedPointer( new JQNetworkServer( serverSettings, connectPoolSettings, connectSettings ) ); 107 | } 108 | 109 | bool JQNetworkServer::begin() 110 | { 111 | JQNETWORK_THISNULL_CHECK( "JQNetworkServer::begin", false ); 112 | 113 | nodeMarkSummary_ = JQNetworkNodeMark::calculateNodeMarkSummary( serverSettings_->dutyMark ); 114 | 115 | if ( globalServerThreadPool_ ) 116 | { 117 | serverThreadPool_ = globalServerThreadPool_.toStrongRef(); 118 | } 119 | else 120 | { 121 | serverThreadPool_ = QSharedPointer< JQNetworkThreadPool >( new JQNetworkThreadPool( serverSettings_->globalServerThreadCount ) ); 122 | globalServerThreadPool_ = serverThreadPool_.toWeakRef(); 123 | } 124 | 125 | if ( globalSocketThreadPool_ ) 126 | { 127 | socketThreadPool_ = globalSocketThreadPool_.toStrongRef(); 128 | } 129 | else 130 | { 131 | socketThreadPool_ = QSharedPointer< JQNetworkThreadPool >( new JQNetworkThreadPool( serverSettings_->globalSocketThreadCount ) ); 132 | globalSocketThreadPool_ = socketThreadPool_.toWeakRef(); 133 | } 134 | 135 | if ( globalCallbackThreadPool_ ) 136 | { 137 | callbackThreadPool_ = globalCallbackThreadPool_.toStrongRef(); 138 | } 139 | else 140 | { 141 | callbackThreadPool_ = QSharedPointer< JQNetworkThreadPool >( new JQNetworkThreadPool( serverSettings_->globalCallbackThreadCount ) ); 142 | globalCallbackThreadPool_ = callbackThreadPool_.toWeakRef(); 143 | } 144 | 145 | if ( !processors_.isEmpty() ) 146 | { 147 | QSet< QThread * > receivedPossibleThreads; 148 | 149 | callbackThreadPool_->waitRunEach( [ &receivedPossibleThreads ]() 150 | { 151 | receivedPossibleThreads.insert( QThread::currentThread() ); 152 | } ); 153 | 154 | for ( const auto &processor: processors_ ) 155 | { 156 | processor->setReceivedPossibleThreads( receivedPossibleThreads ); 157 | } 158 | } 159 | 160 | bool listenSucceed = false; 161 | 162 | serverThreadPool_->waitRun( 163 | [ 164 | this, 165 | &listenSucceed 166 | ]() 167 | { 168 | this->tcpServer_ = QSharedPointer< QTcpServer >( new JQNetworkServerHelper( [ this ]( auto socketDescriptor ) 169 | { this->incomingConnection( socketDescriptor ); } ) ); 170 | 171 | listenSucceed = this->tcpServer_->listen( 172 | this->serverSettings_->listenAddress, 173 | this->serverSettings_->listenPort 174 | ); 175 | } 176 | ); 177 | 178 | if ( !listenSucceed ) { return false; } 179 | 180 | socketThreadPool_->waitRunEach( 181 | [ 182 | this 183 | ]() 184 | { 185 | JQNetworkConnectPoolSettingsSharedPointer connectPoolSettings( new JQNetworkConnectPoolSettings( *this->connectPoolSettings_ ) ); 186 | JQNetworkConnectSettingsSharedPointer connectSettings( new JQNetworkConnectSettings( *this->connectSettings_ ) ); 187 | 188 | connectPoolSettings->connectToHostErrorCallback = bind( &JQNetworkServer::onConnectToHostError, this, _1, _2 ); 189 | connectPoolSettings->connectToHostTimeoutCallback = bind( &JQNetworkServer::onConnectToHostTimeout, this, _1, _2 ); 190 | connectPoolSettings->connectToHostSucceedCallback = bind( &JQNetworkServer::onConnectToHostSucceed, this, _1, _2 ); 191 | connectPoolSettings->remoteHostClosedCallback = bind( &JQNetworkServer::onRemoteHostClosed, this, _1, _2 ); 192 | connectPoolSettings->readyToDeleteCallback = bind( &JQNetworkServer::onReadyToDelete, this, _1, _2 ); 193 | connectPoolSettings->packageSendingCallback = bind( &JQNetworkServer::onPackageSending, this, _1, _2, _3, _4, _5, _6 ); 194 | connectPoolSettings->packageReceivingCallback = bind( &JQNetworkServer::onPackageReceiving, this, _1, _2, _3, _4, _5, _6 ); 195 | connectPoolSettings->packageReceivedCallback = bind( &JQNetworkServer::onPackageReceived, this, _1, _2, _3 ); 196 | 197 | connectSettings->randomFlagRangeStart = 1000000000; 198 | connectSettings->randomFlagRangeEnd = 1999999999; 199 | 200 | connectPools_[ QThread::currentThread() ] = JQNetworkConnectPoolSharedPointer( 201 | new JQNetworkConnectPool( 202 | connectPoolSettings, 203 | connectSettings 204 | ) 205 | ); 206 | } 207 | ); 208 | 209 | return true; 210 | } 211 | 212 | void JQNetworkServer::registerProcessor(const JQNetworkProcessorPointer &processor) 213 | { 214 | JQNETWORK_THISNULL_CHECK( "JQNetworkServer::registerProcessor" ); 215 | 216 | if ( tcpServer_ ) 217 | { 218 | qDebug() << "JQNetworkServer::registerProcessor: please use registerProcessor befor begin()"; 219 | return; 220 | } 221 | 222 | const auto &&availableSlots = processor->availableSlots(); 223 | auto counter = 0; 224 | 225 | for ( const auto ¤tSlot: availableSlots ) 226 | { 227 | if ( processorCallbacks_.contains( currentSlot ) ) 228 | { 229 | qDebug() << "JQNetworkServer::registerProcessor: double register:" << currentSlot; 230 | continue; 231 | } 232 | 233 | const auto &&callback = [ processor ](const JQNetworkConnectPointer &connect, const JQNetworkPackageSharedPointer &package) 234 | { 235 | if ( !processor ) 236 | { 237 | qDebug() << "JQNetworkServer::registerProcessor: processor is null"; 238 | return; 239 | } 240 | 241 | processor->handlePackage( connect, package ); 242 | }; 243 | 244 | processorCallbacks_[ currentSlot ] = callback; 245 | ++counter; 246 | } 247 | 248 | processors_.insert( processor ); 249 | 250 | if ( !counter ) 251 | { 252 | qDebug() << "JQNetworkServer::registerProcessor: no available slots in processor:" << processor->metaObject()->className(); 253 | } 254 | } 255 | 256 | void JQNetworkServer::incomingConnection(const qintptr &socketDescriptor) 257 | { 258 | const auto &&rotaryIndex = socketThreadPool_->nextRotaryIndex(); 259 | 260 | auto runOnConnectThreadCallback = 261 | [ 262 | this, 263 | rotaryIndex 264 | ](const std::function< void() > &callback) 265 | { 266 | this->socketThreadPool_->run( callback, rotaryIndex ); 267 | }; 268 | 269 | socketThreadPool_->run( 270 | [ 271 | this, 272 | runOnConnectThreadCallback, 273 | socketDescriptor 274 | ]() 275 | { 276 | this->connectPools_[ QThread::currentThread() ]->createConnect( 277 | runOnConnectThreadCallback, 278 | socketDescriptor 279 | ); 280 | }, 281 | rotaryIndex 282 | ); 283 | } 284 | 285 | void JQNetworkServer::onPackageReceived( 286 | const JQNetworkConnectPointer &connect, 287 | const JQNetworkConnectPoolPointer &, 288 | const JQNetworkPackageSharedPointer &package 289 | ) 290 | { 291 | if ( processorCallbacks_.isEmpty() ) 292 | { 293 | JQNETWORK_NULLPTR_CHECK( serverSettings_->packageReceivedCallback ); 294 | 295 | callbackThreadPool_->run( 296 | [ 297 | connect, 298 | package, 299 | callback = serverSettings_->packageReceivedCallback 300 | ]() 301 | { 302 | callback( connect, package ); 303 | } 304 | ); 305 | } 306 | else 307 | { 308 | if ( package->targetActionFlag().isEmpty() ) 309 | { 310 | qDebug() << "JQNetworkServer::onPackageReceived: processor is enable, but package targetActionFlag is empty"; 311 | return; 312 | } 313 | 314 | const auto &&it = processorCallbacks_.find( package->targetActionFlag() ); 315 | if ( it == processorCallbacks_.end() ) 316 | { 317 | qDebug() << "JQNetworkServer::onPackageReceived: processor is enable, but package targetActionFlag not match:" << package->targetActionFlag(); 318 | return; 319 | } 320 | 321 | callbackThreadPool_->run( 322 | [ 323 | connect, 324 | package, 325 | callback = *it 326 | ]() 327 | { 328 | callback( connect, package ); 329 | } 330 | ); 331 | } 332 | } 333 | -------------------------------------------------------------------------------- /tester/JQNetworkBenchmark/JQNetworkBenchmark.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core testlib 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | SOURCES += \ 21 | $$PWD/cpp/main.cpp \ 22 | $$PWD/cpp/jqnetwork_benchmark.cpp 23 | 24 | HEADERS += \ 25 | $$PWD/cpp/jqnetwork_benchmark.h 26 | -------------------------------------------------------------------------------- /tester/JQNetworkBenchmark/cpp/jqnetwork_benchmark.cpp: -------------------------------------------------------------------------------- 1 | #include "jqnetwork_benchmark.h" 2 | 3 | // Qt lib import 4 | #include 5 | #include 6 | #include 7 | 8 | // JQNetwork lib import 9 | #include 10 | 11 | void JQNetworkPersisteneTest::test1() 12 | { 13 | auto server = JQNetworkServer::createServer( 12345 ); 14 | 15 | server->serverSettings()->packageReceivedCallback = [](const auto &connect, const auto &package) 16 | { 17 | connect->replyPayloadData( package->randomFlag(), "Test" ); 18 | }; 19 | 20 | if ( !server->begin() ) 21 | { 22 | qDebug() << "test1 error1"; 23 | return; 24 | } 25 | 26 | auto client = JQNetworkClient::createClient(); 27 | 28 | if ( !client->begin() ) 29 | { 30 | qDebug() << "test1 error2"; 31 | return; 32 | } 33 | 34 | const auto &&waitForCreateConnectReply = client->waitForCreateConnect( "127.0.0.1", 12345 ); 35 | qDebug() << "waitForCreateConnect:" << waitForCreateConnectReply; 36 | 37 | if ( !waitForCreateConnectReply ) { return; } 38 | 39 | const auto &&startTime = QDateTime::currentMSecsSinceEpoch(); 40 | auto testCount = 1000000; 41 | auto succeedCount = 0; 42 | QSemaphore semaphore; 43 | 44 | for ( auto count = 0; count < testCount; ++count ) 45 | { 46 | client->sendPayloadData( 47 | "127.0.0.1", 48 | 12345, 49 | "Test", 50 | [ &testCount, &succeedCount, &semaphore ](const auto &, const auto &) 51 | { 52 | if ( ++succeedCount >= testCount ) 53 | { 54 | semaphore.release( 1 ); 55 | } 56 | }, 57 | nullptr 58 | ); 59 | } 60 | 61 | semaphore.acquire( 1 ); 62 | 63 | const auto &&finishTime = QDateTime::currentMSecsSinceEpoch(); 64 | 65 | qDebug() << QString( "test1 finish: total: %1 ms, %2 count/s" ). 66 | arg( finishTime - startTime ). 67 | arg( int( double(testCount) / ( ( finishTime - startTime ) / 1000.0 ) ) ); 68 | } 69 | 70 | void JQNetworkPersisteneTest::test2() 71 | { 72 | QByteArray testData; 73 | for ( auto count = 0; count < 32 * 1024; ++count ) 74 | { 75 | testData.append( char( rand() % 256 ) ); 76 | } 77 | 78 | auto server = JQNetworkServer::createServer( 23456 ); 79 | 80 | server->serverSettings()->packageReceivedCallback = [ testData ](const auto &connect, const auto &package) 81 | { 82 | connect->replyPayloadData( package->randomFlag(), testData ); 83 | }; 84 | 85 | if ( !server->begin() ) 86 | { 87 | qDebug() << "test2 error1"; 88 | return; 89 | } 90 | 91 | auto client = JQNetworkClient::createClient(); 92 | 93 | if ( !client->begin() ) 94 | { 95 | qDebug() << "test2 error2"; 96 | return; 97 | } 98 | 99 | const auto &&waitForCreateConnectReply = client->waitForCreateConnect( "127.0.0.1", 23456 ); 100 | qDebug() << "waitForCreateConnect:" << waitForCreateConnectReply; 101 | 102 | if ( !waitForCreateConnectReply ) { return; } 103 | 104 | const auto &&startTime = QDateTime::currentMSecsSinceEpoch(); 105 | auto testCount = 80000; 106 | auto succeedCount = 0; 107 | QSemaphore semaphore; 108 | 109 | for ( auto count = 0; count < testCount; ++count ) 110 | { 111 | client->sendPayloadData( 112 | "127.0.0.1", 113 | 23456, 114 | testData, 115 | [ &testCount, &succeedCount, &semaphore ](const auto &, const auto &) 116 | { 117 | if ( ++succeedCount >= testCount ) 118 | { 119 | semaphore.release( 1 ); 120 | } 121 | }, 122 | nullptr 123 | ); 124 | } 125 | 126 | semaphore.acquire( 1 ); 127 | 128 | const auto &&finishTime = QDateTime::currentMSecsSinceEpoch(); 129 | const auto &&result = int( double(testCount) / ( ( finishTime - startTime ) / 1000.0 ) ); 130 | 131 | qDebug() << QString( "test2 finish: total: %1 ms, %2 count/s, payload transfer speed: %3 Mbit/s" ). 132 | arg( finishTime - startTime ). 133 | arg( result ). 134 | arg( result * 32 / 1024 * 8 ); 135 | } 136 | 137 | void JQNetworkPersisteneTest::test3() 138 | { 139 | auto server = JQNetworkServer::createServer( 34567 ); 140 | 141 | server->serverSettings()->packageReceivedCallback = [](const auto &connect, const auto &package) 142 | { 143 | connect->replyPayloadData( package->randomFlag(), "Test" ); 144 | }; 145 | 146 | if ( !server->begin() ) 147 | { 148 | qDebug() << "test3 error1"; 149 | return; 150 | } 151 | 152 | auto client = JQNetworkClient::createClient(); 153 | 154 | if ( !client->begin() ) 155 | { 156 | qDebug() << "test3 error2"; 157 | return; 158 | } 159 | 160 | const auto &&waitForCreateConnectReply = client->waitForCreateConnect( "127.0.0.1", 34567 ); 161 | qDebug() << "waitForCreateConnect:" << waitForCreateConnectReply; 162 | 163 | if ( !waitForCreateConnectReply ) { return; } 164 | 165 | const auto &&startTime = QDateTime::currentMSecsSinceEpoch(); 166 | auto testCount = 400000; 167 | auto succeedCount = 0; 168 | QSemaphore semaphore; 169 | 170 | std::function< void() > ping; 171 | ping = [ &testCount, &succeedCount, &semaphore, &ping, &client ]() 172 | { 173 | client->sendPayloadData( 174 | "127.0.0.1", 175 | 34567, 176 | "Test", 177 | [ &testCount, &succeedCount, &semaphore, &ping ](const auto &, const auto &) 178 | { 179 | if ( ++succeedCount >= testCount ) 180 | { 181 | semaphore.release( 1 ); 182 | } 183 | else 184 | { 185 | ping(); 186 | } 187 | }, 188 | nullptr 189 | ); 190 | }; 191 | 192 | ping(); 193 | 194 | semaphore.acquire( 1 ); 195 | 196 | const auto &&finishTime = QDateTime::currentMSecsSinceEpoch(); 197 | 198 | qDebug() << QString( "test3 finish: total: %1 ms, %2 PingPong/s" ). 199 | arg( finishTime - startTime ). 200 | arg( int( double(testCount) / ( ( finishTime - startTime ) / 1000.0 ) ) ); 201 | } 202 | 203 | void JQNetworkPersisteneTest::test4() 204 | { 205 | QByteArray testData; 206 | for ( auto count = 0; count < 32 * 1024; ++count ) 207 | { 208 | testData.append( char( rand() % 256 ) ); 209 | } 210 | 211 | auto server = JQNetworkServer::createServer( 45678 ); 212 | 213 | server->serverSettings()->packageReceivedCallback = [ testData ](const auto &connect, const auto &package) 214 | { 215 | connect->replyPayloadData( package->randomFlag(), testData ); 216 | }; 217 | 218 | if ( !server->begin() ) 219 | { 220 | qDebug() << "test4 error1"; 221 | return; 222 | } 223 | 224 | auto client = JQNetworkClient::createClient(); 225 | 226 | if ( !client->begin() ) 227 | { 228 | qDebug() << "test4 error2"; 229 | return; 230 | } 231 | 232 | const auto &&waitForCreateConnectReply = client->waitForCreateConnect( "127.0.0.1", 45678 ); 233 | qDebug() << "waitForCreateConnect:" << waitForCreateConnectReply; 234 | 235 | if ( !waitForCreateConnectReply ) { return; } 236 | 237 | const auto &&startTime = QDateTime::currentMSecsSinceEpoch(); 238 | auto testCount = 250000; 239 | auto succeedCount = 0; 240 | QSemaphore semaphore; 241 | 242 | std::function< void() > ping; 243 | ping = [ &testCount, &succeedCount, &semaphore, &ping, &client, testData ]() 244 | { 245 | client->sendPayloadData( 246 | "127.0.0.1", 247 | 45678, 248 | testData, 249 | [ &testCount, &succeedCount, &semaphore, &ping ](const auto &, const auto &) 250 | { 251 | if ( ++succeedCount >= testCount ) 252 | { 253 | semaphore.release( 1 ); 254 | } 255 | else 256 | { 257 | ping(); 258 | } 259 | }, 260 | nullptr 261 | ); 262 | }; 263 | 264 | ping(); 265 | 266 | semaphore.acquire( 1 ); 267 | 268 | const auto &&finishTime = QDateTime::currentMSecsSinceEpoch(); 269 | const auto &&result = int( double(testCount) / ( ( finishTime - startTime ) / 1000.0 ) ); 270 | 271 | qDebug() << QString( "test4 finish: total: %1 ms, %2 PingPong/s, payload transfer speed: %3 Mbit/s" ). 272 | arg( finishTime - startTime ). 273 | arg( result ). 274 | arg( result * 32 / 1024 * 8 ); 275 | } 276 | 277 | void JQNetworkPersisteneTest::test5() 278 | { 279 | static QByteArray testData; 280 | for ( auto count = 0; count < 512 * 1024 * 1024; ++count ) 281 | { 282 | testData.append( char( rand() % 256 ) ); 283 | } 284 | 285 | auto server = JQNetworkServer::createServer( 56789 ); 286 | QSemaphore semaphore; 287 | 288 | server->serverSettings()->packageReceivedCallback = [ &semaphore ](const auto &, const auto &) 289 | { 290 | semaphore.release( 1 ); 291 | }; 292 | 293 | if ( !server->begin() ) 294 | { 295 | qDebug() << "test5 error1"; 296 | return; 297 | } 298 | 299 | auto client = JQNetworkClient::createClient(); 300 | 301 | if ( !client->begin() ) 302 | { 303 | qDebug() << "test5 error2"; 304 | return; 305 | } 306 | 307 | const auto &&waitForCreateConnectReply = client->waitForCreateConnect( "127.0.0.1", 56789 ); 308 | qDebug() << "waitForCreateConnect:" << waitForCreateConnectReply; 309 | 310 | if ( !waitForCreateConnectReply ) { return; } 311 | 312 | const auto &&startTime = QDateTime::currentMSecsSinceEpoch(); 313 | 314 | client->sendPayloadData( 315 | "127.0.0.1", 316 | 56789, 317 | testData 318 | ); 319 | 320 | semaphore.acquire( 1 ); 321 | 322 | const auto &&finishTime = QDateTime::currentMSecsSinceEpoch(); 323 | 324 | qDebug() << QString( "test5 finish: total: %1 ms, payload transfer speed: %2 Mbit/s" ). 325 | arg( finishTime - startTime ). 326 | arg( int( 512.0 / ( ( finishTime - startTime ) / 1000.0 ) * 8 ) ); 327 | 328 | } 329 | -------------------------------------------------------------------------------- /tester/JQNetworkBenchmark/cpp/jqnetwork_benchmark.h: -------------------------------------------------------------------------------- 1 | #ifndef __CPP_JQNETWORK_BENCHMARK_H__ 2 | #define __CPP_JQNETWORK_BENCHMARK_H__ 3 | 4 | // Qt lib import 5 | #include 6 | 7 | class JQNetworkPersisteneTest: public QObject 8 | { 9 | Q_OBJECT 10 | Q_DISABLE_COPY( JQNetworkPersisteneTest ) 11 | 12 | public: 13 | JQNetworkPersisteneTest() = default; 14 | 15 | ~JQNetworkPersisteneTest() = default; 16 | 17 | void test1(); 18 | 19 | void test2(); 20 | 21 | void test3(); 22 | 23 | void test4(); 24 | 25 | void test5(); 26 | }; 27 | 28 | #endif//__CPP_JQNETWORK_BENCHMARK_H__ 29 | -------------------------------------------------------------------------------- /tester/JQNetworkBenchmark/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | #include 4 | 5 | // JQNetwork lib import 6 | #include "JQNetworkFoundation" 7 | 8 | // Project import 9 | #include "jqnetwork_benchmark.h" 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | QCoreApplication app(argc, argv); 14 | JQNetwork::printVersionInformation(); 15 | 16 | JQNetworkPersisteneTest benchmark; 17 | 18 | qDebug() << "----- test1 start -----"; 19 | benchmark.test1(); 20 | qDebug() << "----- test1 end -----"; 21 | 22 | qDebug() << "----- test2 start -----"; 23 | benchmark.test2(); 24 | qDebug() << "----- test2 end -----"; 25 | 26 | qDebug() << "----- test3 start -----"; 27 | benchmark.test3(); 28 | qDebug() << "----- test3 end -----"; 29 | 30 | qDebug() << "----- test4 start -----"; 31 | benchmark.test4(); 32 | qDebug() << "----- test4 end -----"; 33 | 34 | qDebug() << "----- test5 start -----"; 35 | benchmark.test5(); 36 | qDebug() << "----- test5 end -----"; 37 | 38 | // QFile file( "/Users/Jason/Desktop/Test.psd" ); 39 | // file.open( QIODevice::ReadOnly ); 40 | 41 | // const auto &&sourceData = file.readAll(); 42 | 43 | // qDebug() << sourceData.size(); 44 | 45 | // auto test = [ & ]( const int &level ) 46 | // { 47 | // const auto &&startTime = QDateTime::currentMSecsSinceEpoch(); 48 | // const auto &&result = qCompress( sourceData, level ).size(); 49 | 50 | // qDebug() << "level:" << level << result << ( QDateTime::currentMSecsSinceEpoch() - startTime ); 51 | // }; 52 | 53 | // test( -1 ); 54 | // test( 1 ); 55 | // test( 2 ); 56 | // test( 3 ); 57 | // test( 4 ); 58 | // test( 5 ); 59 | // test( 6 ); 60 | // test( 7 ); 61 | // test( 8 ); 62 | // test( 9 ); 63 | } 64 | 65 | -------------------------------------------------------------------------------- /tester/JQNetworkOverallTest/JQNetworkOverallTest.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core testlib 14 | 15 | TEMPLATE = app 16 | 17 | JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | HEADERS += \ 21 | $$PWD/cpp/*.h \ 22 | $$PWD/cpp/*.hpp 23 | 24 | SOURCES += \ 25 | $$PWD/cpp/*.cpp 26 | -------------------------------------------------------------------------------- /tester/JQNetworkOverallTest/cpp/fusiontest1.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CPP_FUSIONTEST1_HPP_ 2 | #define CPP_FUSIONTEST1_HPP_ 3 | 4 | // Qt lib import 5 | #include 6 | 7 | // JQNetwork lib import 8 | #include 9 | 10 | namespace FusionTest1 11 | { 12 | 13 | class UserProcessor: public JQNetworkProcessor 14 | { 15 | Q_OBJECT 16 | Q_DISABLE_COPY( UserProcessor ) 17 | 18 | public: 19 | UserProcessor() = default; 20 | 21 | ~UserProcessor() = default; 22 | 23 | public slots: 24 | bool accountLogin(const QVariantMap &received, QVariantMap &send) 25 | { 26 | // qDebug() << "accountLogin:" << received; 27 | 28 | JQNP_CHECKRECEIVEDDATACONTAINSANDNOTEMPTY( "handle", "password" ); 29 | 30 | const auto &&handle = received[ "handle" ].toString(); 31 | const auto &&password = received[ "password" ].toString(); 32 | 33 | if ( ( handle != "test" ) || 34 | ( password != "123456" ) ) 35 | { 36 | JQNP_FAIL( "handle or password error" ); 37 | } 38 | 39 | if ( received.contains( "userName" ) ) 40 | { 41 | send[ "userName" ] = "Jason"; 42 | } 43 | if ( received.contains( "userPhoneNumber" ) ) 44 | { 45 | send[ "userPhoneNumber" ] = "18600000000"; 46 | } 47 | 48 | JQNP_SUCCEED(); 49 | } 50 | }; 51 | 52 | class DataProcessor: public JQNetworkProcessor 53 | { 54 | Q_OBJECT 55 | Q_DISABLE_COPY( DataProcessor ) 56 | 57 | public: 58 | DataProcessor() = default; 59 | 60 | ~DataProcessor() = default; 61 | 62 | public slots: 63 | bool someRecords(const QVariantMap &received, QVariantMap &send) 64 | { 65 | // qDebug() << "someRecords:" << received; 66 | 67 | JQNP_CHECKRECEIVEDDATACONTAINSEXPECTEDCONTENT( "action", { "upload", "download" } ); 68 | 69 | if ( received[ "action" ] == "upload" ) 70 | { 71 | JQNP_CHECKRECEIVEDDATACONTAINS( "someRecords" ); 72 | 73 | someRecords_ = received[ "someRecords" ].toList(); 74 | } 75 | else if ( received[ "action" ] == "download" ) 76 | { 77 | send[ "someRecords" ] = someRecords_; 78 | } 79 | 80 | JQNP_SUCCEED(); 81 | } 82 | 83 | bool msleep(const QVariantMap &received, QVariantMap &send) 84 | { 85 | // qDebug() << "msleep:" << received; 86 | 87 | JQNP_CHECKRECEIVEDDATACONTAINSANDNOT0( "msleep" ); 88 | 89 | QThread::msleep( static_cast< unsigned long >( received[ "msleep" ].toInt() ) ); 90 | 91 | JQNP_SUCCEED(); 92 | } 93 | 94 | private: 95 | QList< QVariant > someRecords_; 96 | }; 97 | 98 | } 99 | 100 | #endif//CPP_FUSIONTEST1_HPP_ 101 | -------------------------------------------------------------------------------- /tester/JQNetworkOverallTest/cpp/fusiontest2.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CPP_FUSIONTEST2_HPP_ 2 | #define CPP_FUSIONTEST2_HPP_ 3 | 4 | // Qt lib import 5 | #include 6 | #include 7 | 8 | // JQNetwork lib import 9 | #include 10 | #include 11 | 12 | namespace FusionTest2 13 | { 14 | 15 | class ServerProcessor: public JQNetworkProcessor 16 | { 17 | Q_OBJECT 18 | 19 | public: 20 | ServerProcessor() = default; 21 | 22 | ~ServerProcessor() = default; 23 | 24 | public slots: 25 | bool registerClient(const QVariantMap &received, QVariantMap &send) 26 | { 27 | JQNP_CHECKRECEIVEDDATACONTAINSANDNOT0( "clientId" ); 28 | 29 | mutex_.lock(); 30 | 31 | clients_[ received[ "clientId" ].toInt() ] = this->currentThreadConnect(); 32 | 33 | mutex_.unlock(); 34 | 35 | JQNP_SUCCEED(); 36 | } 37 | 38 | bool broadcastToAll(const QVariantMap &received, QVariantMap &send) 39 | { 40 | mutex_.lock(); 41 | 42 | for( const auto &connect: clients_ ) 43 | { 44 | connect->putVariantMapData( "receivedMessage", received ); 45 | } 46 | 47 | mutex_.unlock(); 48 | 49 | JQNP_SUCCEED(); 50 | } 51 | 52 | bool broadcastToOne(const QVariantMap &received, QVariantMap &send) 53 | { 54 | JQNP_CHECKRECEIVEDDATACONTAINSANDNOT0( "clientId" ); 55 | 56 | mutex_.lock(); 57 | 58 | clients_[ received[ "clientId" ].toInt() ]->putVariantMapData( "receivedMessage", received ); 59 | 60 | mutex_.unlock(); 61 | 62 | JQNP_SUCCEED(); 63 | } 64 | 65 | private: 66 | QMutex mutex_; 67 | QMap< int, JQNetworkConnectPointer > clients_; 68 | }; 69 | 70 | class ClientProcessor: public JQNetworkProcessor 71 | { 72 | Q_OBJECT 73 | 74 | public: 75 | ClientProcessor() = default; 76 | 77 | ~ClientProcessor() = default; 78 | 79 | inline int receivedMessageCount() const { return receivedMessageCount_; } 80 | 81 | inline QVariantMap lastReceived() const { return lastReceived_; } 82 | 83 | public slots: 84 | void receivedMessage(const QVariantMap &received) 85 | { 86 | mutex_.lock(); 87 | ++receivedMessageCount_; 88 | lastReceived_ = received; 89 | mutex_.unlock(); 90 | } 91 | 92 | private: 93 | QMutex mutex_; 94 | int receivedMessageCount_ = 0; 95 | QVariantMap lastReceived_; 96 | }; 97 | 98 | } 99 | 100 | #endif//CPP_FUSIONTEST2_HPP_ 101 | -------------------------------------------------------------------------------- /tester/JQNetworkOverallTest/cpp/jqnetwork_overalltest.h: -------------------------------------------------------------------------------- 1 | #ifndef CPP_JQNETWORK_OVERALLTEST_H_ 2 | #define CPP_JQNETWORK_OVERALLTEST_H_ 3 | 4 | // Qt lib import 5 | #include 6 | 7 | //#define PRIVATEMACRO public 8 | #define PRIVATEMACRO private 9 | 10 | class JQNetworkOverallTest: public QObject 11 | { 12 | Q_OBJECT 13 | Q_DISABLE_COPY( JQNetworkOverallTest ) 14 | 15 | public: 16 | JQNetworkOverallTest() = default; 17 | 18 | ~JQNetworkOverallTest() = default; 19 | 20 | PRIVATEMACRO slots: 21 | void jqNetworkThreadPoolTest(); 22 | 23 | PRIVATEMACRO slots: 24 | void jqNetworkThreadPoolBenchmark1(); 25 | 26 | PRIVATEMACRO slots: 27 | void jqNetworkThreadPoolBenchmark2(); 28 | 29 | PRIVATEMACRO slots: 30 | void jqNetworkNodeMarkTest(); 31 | 32 | PRIVATEMACRO slots: 33 | void jqNetworkConnectTest(); 34 | 35 | PRIVATEMACRO slots: 36 | void jeNetworkPackageTest(); 37 | 38 | PRIVATEMACRO slots: 39 | void jqNetworkServerTest(); 40 | 41 | PRIVATEMACRO slots: 42 | void jqNetworkClientTest(); 43 | 44 | PRIVATEMACRO slots: 45 | void jqNetworkServerAndClientTest1(); 46 | 47 | PRIVATEMACRO slots: 48 | void jqNetworkServerAndClientTest2(); 49 | 50 | PRIVATEMACRO slots: 51 | void jqNetworkServerAndClientTest3(); 52 | 53 | PRIVATEMACRO slots: 54 | void jqNetworkLanTest(); 55 | 56 | PRIVATEMACRO slots: 57 | void jqNetworkProcessorTest1(); 58 | 59 | PRIVATEMACRO slots: 60 | void jqNetworkProcessorTest2(); 61 | 62 | PRIVATEMACRO slots: 63 | void jqNetworkSendFile(); 64 | 65 | PRIVATEMACRO slots: 66 | void fusionTest1(); 67 | 68 | PRIVATEMACRO slots: 69 | void fusionTest2(); 70 | }; 71 | 72 | #endif//CPP_JQNETWORK_OVERALLTEST_H_ 73 | -------------------------------------------------------------------------------- /tester/JQNetworkOverallTest/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | #include 4 | 5 | // JQNetwork lib import 6 | #include "JQNetworkFoundation" 7 | 8 | // Project import 9 | #include "jqnetwork_overalltest.h" 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | QCoreApplication app(argc, argv); 14 | JQNetwork::printVersionInformation(); 15 | 16 | // for ( auto count = 100; count; --count ) 17 | // { 18 | // if ( QTest::qExec( &jqNetworkTest, argc, argv ) ) 19 | // { 20 | // return -1; 21 | // } 22 | // } 23 | // return 0; 24 | 25 | JQNetworkOverallTest jqNetworkTest; 26 | 27 | return QTest::qExec( &jqNetworkTest, argc, argv ); 28 | } 29 | -------------------------------------------------------------------------------- /tester/JQNetworkOverallTest/cpp/processortest1.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CPP_PROCESSORTEST1_HPP_ 2 | #define CPP_PROCESSORTEST1_HPP_ 3 | 4 | // Qt lib import 5 | #include 6 | 7 | // JQNetwork lib import 8 | #include 9 | 10 | namespace ProcessorTest1 11 | { 12 | 13 | class TestProcessor: public JQNetworkProcessor 14 | { 15 | Q_OBJECT 16 | Q_DISABLE_COPY( TestProcessor ) 17 | 18 | public: 19 | TestProcessor() = default; 20 | 21 | ~TestProcessor() = default; 22 | 23 | public slots: 24 | void actionFlag(const QVariantMap &received) 25 | { 26 | testData_ = received; 27 | testData2_ = QThread::currentThread(); 28 | } 29 | 30 | public: 31 | QVariantMap testData_; 32 | QThread *testData2_; 33 | }; 34 | 35 | } 36 | 37 | #endif//CPP_PROCESSORTEST1_HPP_ 38 | -------------------------------------------------------------------------------- /tester/JQNetworkOverallTest/cpp/processortest2.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CPP_PROCESSORTEST2_HPP_ 2 | #define CPP_PROCESSORTEST2_HPP_ 3 | 4 | // Qt lib import 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | // JQNetwork lib import 11 | #include 12 | 13 | namespace ProcessorTest2 14 | { 15 | 16 | class TestProcessor: public JQNetworkProcessor 17 | { 18 | Q_OBJECT 19 | Q_DISABLE_COPY( TestProcessor ) 20 | 21 | public: 22 | TestProcessor() = default; 23 | 24 | ~TestProcessor() = default; 25 | 26 | static QFileInfo testFileInfo(const int &index) 27 | { 28 | return QString( "%1/JQNetworkOverallTest/myprocessor2_testfile%2" ).arg( QStandardPaths::writableLocation( QStandardPaths::TempLocation ), QString::number( index ) ); 29 | } 30 | 31 | static bool createTestFile(const int &index) 32 | { 33 | QDir().mkpath( QString( "%1/JQNetworkOverallTest" ).arg( QStandardPaths::writableLocation( QStandardPaths::TempLocation ) ) ); 34 | 35 | QFile file( testFileInfo( index ).filePath() ); 36 | if ( !file.open( QIODevice::WriteOnly ) ) { return false; } 37 | 38 | file.resize( 4 ); 39 | file.write( "test" ); 40 | file.waitForBytesWritten( 5000 ); 41 | 42 | return true; 43 | } 44 | 45 | public slots: 46 | void receivedByteArray(const QByteArray &received) 47 | { 48 | if ( received == "test" ) 49 | { 50 | mutex_.lock(); 51 | ++counter_[ "receivedByteArray" ]; 52 | mutex_.unlock(); 53 | } 54 | } 55 | 56 | void receivedByteArraySendByteArray(const QByteArray &received, QByteArray &send) 57 | { 58 | if ( received == "test" ) 59 | { 60 | mutex_.lock(); 61 | ++counter_[ "receivedByteArraySendByteArray" ]; 62 | mutex_.unlock(); 63 | } 64 | send = "test"; 65 | } 66 | 67 | void receivedByteArraySendVariantMap(const QByteArray &received, QVariantMap &send) 68 | { 69 | if ( received == "test" ) 70 | { 71 | mutex_.lock(); 72 | ++counter_[ "receivedByteArraySendVariantMap" ]; 73 | mutex_.unlock(); 74 | } 75 | send = QVariantMap( { { "key", "value" } } ); 76 | } 77 | 78 | void receivedByteArraySendFile(const QByteArray &received, QFileInfo &send) 79 | { 80 | if ( received == "test" ) 81 | { 82 | mutex_.lock(); 83 | ++counter_[ "receivedByteArraySendFile" ]; 84 | mutex_.unlock(); 85 | } 86 | send = QFileInfo( this->testFileInfo( 3 ) ); 87 | } 88 | 89 | void receivedVariantMap(const QVariantMap &received) 90 | { 91 | if ( received == QVariantMap( { { "key", "value" } } ) ) 92 | { 93 | mutex_.lock(); 94 | ++counter_[ "receivedVariantMap" ]; 95 | mutex_.unlock(); 96 | } 97 | } 98 | 99 | void receivedVariantMapSendByteArray(const QVariantMap &received, QByteArray &send) 100 | { 101 | if ( received == QVariantMap( { { "key", "value" } } ) ) 102 | { 103 | mutex_.lock(); 104 | ++counter_[ "receivedVariantMapSendByteArray" ]; 105 | mutex_.unlock(); 106 | } 107 | send = "test"; 108 | } 109 | 110 | void receivedVariantMapSendVariantMap(const QVariantMap &received, QVariantMap &send) 111 | { 112 | if ( received == QVariantMap( { { "key", "value" } } ) ) 113 | { 114 | mutex_.lock(); 115 | ++counter_[ "receivedVariantMapSendVariantMap" ]; 116 | mutex_.unlock(); 117 | } 118 | send = QVariantMap( { { "key", "value" } } ); 119 | } 120 | 121 | void receivedVariantMapSendFile(const QVariantMap &received, QFileInfo &send) 122 | { 123 | if ( received == QVariantMap( { { "key", "value" } } ) ) 124 | { 125 | mutex_.lock(); 126 | ++counter_[ "receivedVariantMapSendFile" ]; 127 | mutex_.unlock(); 128 | } 129 | send = QFileInfo( this->testFileInfo( 3 ) ); 130 | } 131 | 132 | void receiveFile(const QFileInfo &received) 133 | { 134 | if ( received == this->testFileInfo( 2 ) ) 135 | { 136 | mutex_.lock(); 137 | ++counter_[ "receiveFile" ]; 138 | mutex_.unlock(); 139 | } 140 | } 141 | 142 | void receiveFileSendByteArray(const QFileInfo &received, QByteArray &send) 143 | { 144 | if ( received == this->testFileInfo( 2 ) ) 145 | { 146 | mutex_.lock(); 147 | ++counter_[ "receiveFileSendByteArray" ]; 148 | mutex_.unlock(); 149 | } 150 | send = "test"; 151 | } 152 | 153 | void receiveFileSendVariantMap(const QFileInfo &received, QVariantMap &send) 154 | { 155 | if ( received == this->testFileInfo( 2 ) ) 156 | { 157 | mutex_.lock(); 158 | ++counter_[ "receiveFileSendVariantMap" ]; 159 | mutex_.unlock(); 160 | } 161 | send = QVariantMap( { { "key", "value" } } ); 162 | } 163 | 164 | void receiveFileSendFile(const QFileInfo &received, QFileInfo &send) 165 | { 166 | if ( received == this->testFileInfo( 2 ) ) 167 | { 168 | mutex_.lock(); 169 | ++counter_[ "receiveFileSendFile" ]; 170 | mutex_.unlock(); 171 | } 172 | send = QFileInfo( this->testFileInfo( 3 ) ); 173 | } 174 | 175 | void receivedVariantMapAndAppendSendVariantMapAndAppend( 176 | const QVariantMap &received, 177 | QVariantMap &send, 178 | const QVariantMap &receivedAppend, 179 | QVariantMap &sendAppend 180 | ) 181 | { 182 | if ( ( received == QVariantMap( { { "key2", "value2" } } ) ) && 183 | ( receivedAppend == QVariantMap( { { "key3", "value3" } } ) ) ) 184 | { 185 | mutex_.lock(); 186 | ++counter_[ "receivedVariantMapAndAppendSendVariantMapAndAppend" ]; 187 | mutex_.unlock(); 188 | } 189 | 190 | send = QVariantMap( { { "key", "value" } } ); 191 | sendAppend = QVariantMap( { { "key2", "value2" } } ); 192 | } 193 | 194 | public: 195 | QMutex mutex_; 196 | QMap< QString, int > counter_; // methodName -> count 197 | }; 198 | 199 | } 200 | 201 | #endif//CPP_PROCESSORTEST2_HPP_ 202 | -------------------------------------------------------------------------------- /tester/JQNetworkPersisteneTest/JQNetworkPersisteneTest.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | QT += core testlib 14 | 15 | TEMPLATE = app 16 | 17 | #JQNETWORK_COMPILE_MODE = SRC 18 | include( $$PWD/../../sharedlibrary/JQNetwork/JQNetwork.pri ) 19 | 20 | SOURCES += \ 21 | $$PWD/cpp/main.cpp \ 22 | $$PWD/cpp/jqnetwork_persistenetest.cpp 23 | 24 | HEADERS += \ 25 | $$PWD/cpp/jqnetwork_persistenetest.h 26 | -------------------------------------------------------------------------------- /tester/JQNetworkPersisteneTest/cpp/jqnetwork_persistenetest.cpp: -------------------------------------------------------------------------------- 1 | #include "jqnetwork_persistenetest.h" 2 | 3 | // Qt lib import 4 | #include 5 | #include 6 | #include 7 | 8 | // JQNetwork lib import 9 | #include 10 | 11 | void JQNetworkPersisteneTest::test() 12 | { 13 | QMutex mutex; 14 | qint64 sendCount = 0; 15 | qint64 succeedCount = 0; 16 | QByteArray testData; 17 | for ( auto count = 0; count < 4 * 1024; ++count ) 18 | { 19 | testData.append( char( rand() % 256 ) ); 20 | } 21 | 22 | auto server = JQNetworkServer::createServer( 56789 ); 23 | 24 | server->serverSettings()->packageReceivedCallback = [ & ](const auto &, const auto &package) 25 | { 26 | if ( package->payloadData() != testData ) 27 | { 28 | qDebug() << "test error3"; 29 | return; 30 | } 31 | 32 | mutex.lock(); 33 | ++succeedCount; 34 | mutex.unlock(); 35 | }; 36 | 37 | if ( !server->begin() ) 38 | { 39 | qDebug() << "test error1"; 40 | return; 41 | } 42 | 43 | auto client = JQNetworkClient::createClient(); 44 | 45 | if ( !client->begin() ) 46 | { 47 | qDebug() << "test error2"; 48 | return; 49 | } 50 | 51 | const auto &&waitForCreateConnectReply = client->waitForCreateConnect( "127.0.0.1", 56789 ); 52 | qDebug() << "waitForCreateConnect:" << waitForCreateConnectReply; 53 | 54 | if ( !waitForCreateConnectReply ) { return; } 55 | 56 | const auto &&startTime = QDateTime::currentMSecsSinceEpoch(); 57 | QTimer timerForSend; 58 | QTimer timerForPrint; 59 | QEventLoop eventLoop; 60 | 61 | auto sendTestData = [ & ]() 62 | { 63 | client->sendPayloadData( 64 | "127.0.0.1", 65 | 56789, 66 | testData 67 | ); 68 | 69 | mutex.lock(); 70 | ++sendCount; 71 | mutex.unlock(); 72 | 73 | timerForSend.start(); 74 | }; 75 | 76 | auto printData = [ & ]() 77 | { 78 | qDebug() << "run time:" << ( ( QDateTime::currentMSecsSinceEpoch() - startTime ) / 1000 / 3600 ) << "hour" 79 | << ( ( QDateTime::currentMSecsSinceEpoch() - startTime ) / 1000 % 3600 / 60 ) << "minute," 80 | << "send count:" << sendCount << "," 81 | << "succeed count:" << succeedCount; 82 | 83 | if ( ( sendCount - succeedCount ) > 1000 ) 84 | { 85 | qDebug() << "test error3"; 86 | eventLoop.quit(); 87 | } 88 | 89 | timerForPrint.start(); 90 | }; 91 | 92 | timerForSend.setInterval( 100 ); 93 | timerForPrint.setInterval( 30 * 1000 ); 94 | 95 | connect( &timerForSend, &QTimer::timeout, sendTestData ); 96 | connect( &timerForPrint, &QTimer::timeout, printData ); 97 | 98 | timerForSend.start(); 99 | timerForPrint.start(); 100 | 101 | eventLoop.exec(); 102 | } 103 | -------------------------------------------------------------------------------- /tester/JQNetworkPersisteneTest/cpp/jqnetwork_persistenetest.h: -------------------------------------------------------------------------------- 1 | #ifndef __CPP_JQNETWORK_PERSISTENETEST_H__ 2 | #define __CPP_JQNETWORK_PERSISTENETEST_H__ 3 | 4 | // Qt lib import 5 | #include 6 | 7 | class JQNetworkPersisteneTest: public QObject 8 | { 9 | Q_OBJECT 10 | Q_DISABLE_COPY( JQNetworkPersisteneTest ) 11 | 12 | public: 13 | JQNetworkPersisteneTest() = default; 14 | 15 | ~JQNetworkPersisteneTest() = default; 16 | 17 | void test(); 18 | }; 19 | 20 | #endif//__CPP_JQNETWORK_PERSISTENETEST_H__ 21 | -------------------------------------------------------------------------------- /tester/JQNetworkPersisteneTest/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Qt lib import 2 | #include 3 | #include 4 | 5 | // JQNetwork lib import 6 | #include "JQNetworkFoundation" 7 | 8 | // Project import 9 | #include "jqnetwork_persistenetest.h" 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | QCoreApplication app(argc, argv); 14 | JQNetwork::printVersionInformation(); 15 | 16 | JQNetworkPersisteneTest persisteneTest; 17 | 18 | persisteneTest.test(); 19 | } 20 | 21 | -------------------------------------------------------------------------------- /tester/tester.pro: -------------------------------------------------------------------------------- 1 | # 2 | # This file is part of JQNetwork 3 | # 4 | # Library introduce: https://github.com/188080501/JQNetwork 5 | # 6 | # Copyright: Jason 7 | # 8 | # Contact email: Jason@JasonServer.com 9 | # 10 | # GitHub: https://github.com/188080501/ 11 | # 12 | 13 | TEMPLATE = subdirs 14 | 15 | SUBDIRS += JQNetworkOverallTest 16 | SUBDIRS += JQNetworkBenchmark 17 | SUBDIRS += JQNetworkPersisteneTest 18 | --------------------------------------------------------------------------------