三、客户端模块
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 客户端小结
接收数据并显示在客户端中逻辑比较复杂,美化需要下功夫。。