三、客户端模块
3.1 客户端模块结构
计算节点模块主要功能为数据管理、日志管理、配置管理、处理线程管理、进程通信管理、TCP通信管理,该模块由以下几个类组成。
类名 |
关系类 |
关系 |
Mainwindow |
login |
聚合 |
Mainwindow |
tcp_socket |
聚合 |
Mainwindow |
Setting |
聚合 |
MainWindow:交互类模块,负责数据的显示、处理。
名称 |
类型 |
说明 |
get_information |
方法 |
接收数据并处理 |
on_search_task_clicked |
方法 |
查找计算任务 |
on_search_caculate_information_clicked |
方法 |
获取计算节点信息 |
on_delete_task_clicked |
方法 |
删除计算任务 |
on_commit_DLL_clicked |
方法 |
上传动态链接库 |
on_commit_task_clicked |
方法 |
上传计算任务文件 |
Login:登陆类,负责用户的登陆,。
表3.10 Login表
名称 |
类型 |
说明 |
on_login_P_clicked |
方法 |
用户登陆 |
on_pushButton_clicke |
方法 |
退出 |
Setting:配置模块,负责配置的读取、储存。
名称 |
类型 |
说明 |
Init |
方法 |
初始化配置类 |
Start |
方法 |
开始读取配置 |
Tcp_Socket |
Tcp连接类 |
负责数据的发送与传输 |
send_message |
方法 |
发送数据 |
Receive |
方法 |
接收数据 |
Pack_data |
方法 |
数据反序列化 |
客户端模块类图
3.2 基本原理
3.2.1 login类
以下是login使用。代码如下:
login *login1=new login(); connect(socket,SIGNAL(reply_data(QStringList)),login1,SLOT(receive_data(QStringList))); connect(login1,SIGNAL(socket_senddata(QString,QString,QString)),socket,SLOT(send_data(QString,QString,QString))); connect(login1,SIGNAL(socket_setpassword(QString)),socket,SLOT(setpassword(QString))); connect(login1,SIGNAL(set_id_password(QString,QString)),this,SLOT(get_id_password(QString,QString))); login1->setModal(true); login1->setsocket(socket); int result=login1->exec(); if(result!=1) { exit(0); } else { delete login1; this->show(); showtime(); timer=new QTimer(this); connect(timer,&QTimer::timeout,this,&MainWindow::showtime); timer->start(1000); update=new QTimer(this); connect(update,&QTimer::timeout,this,&MainWindow::update_data); update->start(10000); ui->task_widget->setColumnWidth(0,100); ui->task_widget->setColumnWidth(2,80); ui->task_widget->setColumnWidth(4,130); ui->task_widget->setColumnWidth(5,130); }
登陆类将登陆信息转发给MainWindow类进行信息发送,根据返回结果进行判定。
if(data[1]=="用户登陆") { if(data[2]=="登陆成功") { qDebug()<<data; this->accept(); } else { QMessageBox::about(NULL, "登陆失败", "账号密码错误!"); } }
3.2.2 MainWindow类
获取在线节点、任务之类功能就是发送查询内容至服务器,接收服务器返回的结果并显示在客户端中。在上传DLL中客户端必须检测是否有效否则拒绝上传,以下为代码:
void MainWindow::on_choice_DLL_clicked() { QString filename; filename = QFileDialog::getOpenFileName(this,tr("选择DLL"),"",tr("DLL (*.dll)")); //选择路径 if(filename.isEmpty()) { return; } else { QLibrary lib(filename); if(!lib.load()) { QMessageBox::information(this,tr("不是有效的DLL"),tr("不是有效的dll!")); return; } lib.unload(); DllPath=filename; ui->DLL_lineEdit->setText(filename); } }
3.2.3 客户端小结
接收数据并显示在客户端中逻辑比较复杂,美化需要下功夫。。