精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
关键词:C/S架构,多视图界面,多线程技术,复杂的文本格式协议
特定局域网内为实现某具体工作而要求一个统一的时间,因此需要通过一台服务器,向其他客户机群发送统一授时时间。
需求名称 | 详细要求 |
软件环境 |
windows xp系统 |
硬件系统 |
普通PC均可 |
本系统基于C/S架构模式,使用Socket套接字进行通信,使用自定义通信协议。
系统处理流程如下所示:
服务器端中使用的通信套接字如下表:
套接字 |
标识符 |
功能 |
服务器端侦听套接字 |
CMyServerSocket |
对规定端口进行侦听 |
服务器端连接套接字 |
CNewSocket |
与已连接客户端进行通信 |
服务器端窗口视图层次如下表:
模块 |
主框架 |
子框架 |
视图 |
|||
标识符 |
功能 |
标识符 |
功能 |
标识符 |
功能 |
|
消息处理 |
CMainFrame |
显示主框架 |
CRaChildFrame |
自定义框架,显示消息处理框架 |
CMsgView |
处理消息信息 |
打印处理 |
CMainFrame |
显示主框架 |
CRaChildFrame |
自定义框架,实现打印预览功能 |
CRecView |
显示查询条件 |
CPrePrintView |
实现打印预览框架 |
|||||
CRaChildFrame |
自定义框架,实现打印功能 |
无 |
服务器端重要数据结构描述表:
数据结构名称 |
标识符 |
类型 |
长度 |
作用 |
通信套接字缓冲区 |
CNewSocket:: m_szBuffer |
char |
4096字节 |
存储服务器与客户端之间通信的数据包 |
消息处理子框架关联视图 |
CMsgView |
CFormView |
显示消息处理界面 |
|
打印预览子框架关联视图 |
CRecView |
CFormView |
显示查询信息处理界面 |
|
打印子框架关联视图 |
CPrePrintView |
CView |
显示打印预览界面 |
|
实现打印功能 |
||||
列表框控件 |
CMyList |
CListCtrl |
显示查询结果 |
通过Socket套接字对特定端口进行持续性侦听,以便客户端能随时连上服务器。
和启动侦听功能相对,关闭服务器侦听状态,关闭后,客户端连接服务器时提示超时错误,从而实现关闭服务器的功能。
在与某一具体客户端进行授时过程中,由服务器主动中断与该客户端的数据传输,而其他客户端依然可以连接到服务器。
接收客户端的授时请求后,将此时刻的服务器时间发送至该客户端。
与客户端相一致,授时精确到秒,体现在界面上为授时时间每秒调整一次。
若客户端发出的授时请求数据包内容为渐变授时,则服务器会在该授时时间段内等待客户端的回复信息,并在界面上动态显示具体的调整时间。
若客户端发出的授时请求数据包内容为一次性授时,服务器端授时后接收客户端回复信息并立即显示授时后状态(授时成功与否根据客户端回复信息判断)。
每次服务器与客户端的授时记录会存入数据库,信息查询可以指定查询条件来检索数据库中符合条件的授时记录信息,查询结果以列表的形式展现,并支持对该列表中内容的打印预览及打印功能。
支持多客户端同时连接服务器并向服务器发送授时请求,服务器以多视图的形式向用户显示各个客户端的请求处理状态,一个客户端请求对应一个视图,层次清晰,易于操作。
为用户设置供查询的条件,以几种查询条件的多种组合为条件从数据库中读取符合条件的记录集并显示给用户。
允许用户预览存储查询结果的列表框,该预览中生成的列表框内容打印预览效果即为最终打印效果。
服务器端读取客户端的回复数据包,分析出此次授时的授时性质和授时状态,若授时性质为一次性授时服务器端会立即设置并返回授时状态,同时在用户界面上显示状态信息以提示用户此次操作的最终结果。
服务器端读取客户端的回复数据包,分析出此次授时的授时性质和授时状态,若授时性质为渐变授时,则服务器端会在设置相应授时状态的同时等待并处理客户端的动态同步回复信息,此处理结果也以时间走秒的形式动态呈现给用户,使用户时刻掌握服务器的运行状态。
首先提供给用户用于查询的检索条件,而后根据用户所选条件的各种组合情况来查数据库,将符合检索条件的记录的完整信息(包括记录的条数,记录的各字段内容等)输出至用户界面以供用户查看和使用。
用户在打印查询结果列表之前先预览一下打印的效果,打印预览呈现的打印效果即为最终报表的打印效果。
宋体,正常体,9号(打印文字为12号),黑色。
a).尺寸
在合理的布局下尽可能多的显示控件内的内容。
b).布局
按照操作流程或浏览顺序自左至右、由上而下的排放各种控件,使界面整体协调、美观大方。
授时模块与信息查询模块之间的功能比较独立,在程序逻辑上没有联系,而在数据共享上存在一定联系:授时模块将每次的授时信息写入数据库,信息查询模块根据具体的查询条件从数据库中读取各条授时信息记录。
1) 和Windows操作系统的接口主要通过API函数和MFC函数实现。
2) 和Access数据库的接口 通过ADO技术和SQL语句实现。
该协议用于授时系统中,使用文本格式,tcp方式进行传输。协议支持2个基本要求:一次性授时完成和渐变多次授时。渐变多次授时规定有间隔步长。间隔步长规定了每隔多少秒来调整1秒时间。由于有渐变多次模式,所以服务器端通信数据的接收是被动方式,客户端连接上以后,有没有下次请求服务器端不知道,所以服务器端何时关闭,要由服务器端自己来定。
动作 |
值 |
上行 |
下行 |
BAG |
8位2进制数 |
标识动作有无 |
标识动作有无 |
IP |
Ipv4 |
客户端IP |
无 |
REQUEST |
YYYY-mm-DD HH:MM:ss |
客户端发送请求时间 |
无 |
TSERVER |
YYYY-mm-DD HH:MM:ss |
无 |
服务器时间 |
COMPLETE |
0或1或2 |
0:授时失败,1:授时开始, 2:授时完成 |
无 |
TSPAN |
间隔秒数 |
客户端调整时间的间隔秒数 |
无 |
SHUT |
1上行 |
客户端断开连接 |
服务器断开客户端连接 |
8位二进制数,低6位标识相应动作有无,从低到高顺序依次为IP, REQUEST,TSERVER,COMPLETE, TSPAN,SHUT,剩余2位扩展。主要是为了提高包内数据分析效率;
例如:
BAG中数据为(00000011)2,则其代表当前数据包含有动作:IP和REQUEST。
该字段记录客户端IPv4地址,主要用于标识服务器与特定客户端的连接和断开状态。
该字段记录客户端发送请求时的时间信息。
该字段记录服务器授于客户端的时间信息。
该字段标识客户端向服务器回复授时情况,若值为0,则代表着本次授时失败;若其值为1,则表示客户端已经开始此次授时;若值为2,则代表授时完成。此时,服务器应重新发送授时信息。
该字段记录客户端调整时间间隔步长,范围0~30秒,若为0秒即为一次性授时,其他值则表示渐变授时。
渐变授时:间隔TSPAN秒,客户端时间向服务器时间靠近1秒。
例如:
TSPAN值为5,客户端时间与服务器时间相差3秒,则客户端从接受服务器时间开始,先将时差缩小1秒,而后每隔5秒再将时差缩小1秒,总共用时时间为5*(3-1)=10秒。
该字段只在客户端或服务器中断连接时设置其值。
段内分隔符:冒号“:”,分隔动作和其对应的值,例如IP:192.168.0.1
段间分隔符:美元符号“$”,分隔不同动作,例如IP:192.168.0.1$ REQUEST: 2010-07-13 14:50:03
结束符:“@”,标识数据包结束,例如IP:192.168.0.1$ REQUEST: 2010-07-13 14:50:03@
服务器时间:BAG:4$TSERVER: $@ (BAG:100=>4)
授时中断: BAG:32$SHUT:2$@ (BAG:100000=>32)
请求: BAG:19$IP:$REQUEST: $TSPAN: $@ (BAG:010011=>19)
回复: BAG:8$COMPLETE:0/1$@ (BAG:1000=>8)
授时中断:BAG:40$COMPLETE:0$SHUT:1$@ (BAG:101000=>40)
授时成功:BAG:40$COMPLETE:2$SHUT:1$@ (BAG:101000=>40)