APP下载

印刷数字样张远程传输系统的编程实现

2019-02-27

网络安全和信息化 2019年2期
关键词:预览客户端服务器

系统的实现基于如下开发环境,如表1所示。

客户端功能模块实现

客户端主要由连接模块、数据库模块、任务管理模块、状态信息模块、预览模块、错误处理模块等组成。其中,客户端自动重连机制的实现是非常关键的,系统设计了两种情况将调用该机制:第一是客户端启动时,第二是网络出现问题时。

1.客户端启动时

(1)查询数据库,检查是否有未完成任,如果没有直接进行第(4)步;

(2)如果有未完成任务,将任务加入任务管理队列;

(3)处理未完成任务,利用任务信息,向服务器端发送重连请求(RegUnfiCMD);根据任务对应的服务器IP地址,分别与对应服务器建立连接;值得注意的是,每个客户端与每个服务器之间只有一条通道。发往同一服务器的后续任务直接利用已用通道,发送更新信息。

表1 开发环境

(4)启动客户端。

2.当服务器与客户端网络断开后

(1)客户端在1分钟后,查询数据库,读取未完成任务,如果没有,等待新的任务;

(2)如果有未完成任务,将任务加入任务管理队列;

(3)处理未完成任务,从新与服务器进行连接请求,后续队列的任务做相同的操作,但如果服务器与客户端已经建立连接,后续任务不需要再发送建立连接请求;如果不能建立连接,转到第(1)步。

当客户端启动时自动重连对应的伪代码如下:

当服务器与客户端网络断开后,调用定时器SetTimer(10,60000,NULL),则OnTimer(UINT nIDEvent)就会在1分钟后激活进行重连请求。OnTimer实际上调用了客户端启动时的处理机制。由于系统是多对多模式,因此在服务器与客户端网络断开后,客户端与其他服务器的连接不会影响,只是处理断开的服务器重连。

由于本系统采用基于安全通道的网络机制,故实现客户端连接模块的代码利用OpenSSL。

当有任务要上传的时候,首先需要选择可信的服务器,然后通过三次握手建立连接。

下面是对应的伪代码:

只有通信双方具有可信的证书,才能建立起连接。这样就确保了通信双方能够在安全状态下进行数据传输。

数据库模块是客户端合理工作的保证,涉及任务管理、任务插入、任务查询和任务删除等。本系统利用开源ado2类对ACEESS数据库进行读写操作。设计对数据操作的CDatebaseMannager类,该类涉及如下函数:

int OpenDatabase();打开数据库

int CloseDatabase();关闭数据库

int SelectSQL(CString strSQLCommand);查询数据库

int InsertSQL(CString strSQLCommand);插入数据库

int UpdateSQL(CString strSQLCommand);更新数据库

int DeleteSQL(CString strSQLCommand);删除数据库

int ExecuteProc(CStri ng strSQLCommand); 执行SQL语句

任务管理模块主要负责任务的调度、任务上传以及与服务器间的通信,是整个客户端系统的灵魂。

实现的函数为handleUploadCmd,该函数是整个系统运行的保证,在函数内部设计任务文件的上传、文件的压缩以及文件状态管理。

图像预览模块利用CxImage类,可以对各类文件进行预览,即任务文件在上传之前,用户可以对起预览。

同 时, 可 以 设 计CPictrueView类对预览文件进行放大、缩小等操作。

OpenTifFile函数负责对传输文件读取预览。

与此同时,系统还提供了GetFirstBitmapFromAvi函数,实现获取并预览avi文件第一帧图像的功能。

类CStateShowDlg是状态信息模块,用于把任务实际运行状态反馈给用户,通过与任务管理模块相结合,实时反映任务状态。

其伪代码如下:

更加详细的任务状态信息是基于任务内部的单个文件,系统中定义了如下结构体用于管理文 件 :FileUploadInfo、CurrentUploadStatus、UploadFileStatus等。除此之外,客户端还有以下几个类:CClientDlg是整个系统的框架;CDutyInitDlg主要负责任务初始化。

与数据库通信部分的实现,主要涉及到部门信息的编辑、历史任务的查询以及任务对应文件的查询。其过程如下:

第一,是部门信息的编辑,这部分主要是提供数据库接口,方便添加、删除、修改部门信息。

增加部门信息的实现函数为AddClinicInfoRecord函数,具体实现为:

同样有关修改部门信息的实现为ModifyClinicInfoRecord函数,其具体实现方式,如图1所示。

图1 修改函数的具体实现

第二,是历史任务查询,通过给定的起止时间、查询数据库、返回所有满足条件的人物信息,核心查询函数为OnCheck函数,实现代码如图2所示。

第三,查询任务对应文件信息主要对应两个位置:其一是查询历史任务时,支持返回每个任务对应的文件;其二是任务状态栏中任务对应的文件查询功能。SQLFILE函数实现形式如图3所示。

图2 历史任务查询的具体实现

图3 SQLFILE函数实现形式

服务器功能模块实现

服务器端主要实现如下模块:启动模块、客户端连接请求模块、数据库管理模块、客户端管理模块、任务管理模块、任务状态及预览模块、任务接收模块、文件解压模块。

启动模块是主要完成服务器启动,打开监听端口,同样利用OpenSSL开放源码。服务器启动时,AfxBeginThr ead(ServerThread,this)实现网络初始化,伪代码如下:

服务器端数据库管理模块类似与客户端,同样也利用设计的CDatebaseMannager类 对ACCESS数据库进行读写操作。服务器启动时,同样需要读取未完成任务,并加入任务管理队列,并等待客户端发续传请求进行激活。

客户端管理模块与任务管理模块是服务器系统管理的主要对象。建立不同的数据结构进行管理。ListManagement用于任务管理,而ListServer用于管理客户端。所有的待完成任务都由ListManagement进行管理,每个SSL对应一个客户端IP地址。

任务状态模块,它同客户端一样。

客户端与服务器的通信实现

客户端先发起服务器请求,并与服务器建立SSL连接后,就可以与服务器进行通信。

发送新任务注册SendDutyReg(SSL*ssl),更新未完成任务SendRegUnfinish(SSL* ssl,DutyInfo* dutyinfo)。对应接收服务器通信函数为HandleData(SSL * ssl),getNextUploadItem()函数在客户端与服务器建立连接后,就持续工作,负责任务上传的同步。

handleUploadCmd(char*m_pRecvData,SSL *ssl,int uploadflag)函数实现任务上传,该函数中涉及文件压缩、状态信息反馈、任务调度等。

一个任务实际上由一个或多个文件组成,因此任务上传主要完成对文件的上传。

任务上传的状态见表2所示,这些状态同时也会反馈给客户端用户。

服务器与客户端通信实现:服务器根据任务队列,调用getNextUploadItem函数,发送针对某个任务的UploadCMD请求给客户端。客户端HandleData函数接收到UploadCMD命令,调用handleUploadCmd处理该任务对应文件的上传。

表2 任务上传状态

猜你喜欢

预览客户端服务器
你的手机安装了多少个客户端
“人民网+客户端”推出数据新闻
——稳就业、惠民生,“数”读十年成绩单
新品预览
新品预览
PowerTCP Server Tool
BlackJumboDog
2018年全球服务器市场将保持温和增长
11月在拍电视剧预览表
媒体客户端的发展策略与推广模式
新华社推出新版客户端 打造移动互联新闻旗舰