客户端服务器模式制作详解.ppt

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Srecv:ScanTm: 检查服务器时间校对试卷修改试卷状态,抛出计数值 Srecv:GetSta: 获取试卷状态 Srecv:GetRlt: 获取上次做答
Srecv:GetNum: 获得试卷相关信息(总题数,开考时间,结束时间) Srecv:GetQue: 获取试卷题目内容. Srecv:SaveDt: 保存试卷 Srecv:ChanST: 修改试卷状态.
服务器程序详解2
完全端口模型的具体实现 为了使用”完成端口模型”,我产生了 一堆线程在端口上等待,线程数量 =CPU个数x2+2,我将每个客户端产 生的文件句柄与I/O completion ports端口相关联,建立了这种关系之 后,任何客户端发出操作请求,便会导 致I/O completion packet被送到” 完成端口”去,这个步骤是操作系统 完成的,为了回应I/O completion packet,我让I/O completion释放 一个等待中的线程,如果目前没有线 程正在等待,它不会为这个客户端N 产生新的线程, 当作用中的线程处理 完毕相应客户端的”overlapped I/O”后,将返回I/O completion端口 进行等待. 客户端N这时才能够被处 理,这样就保证了我的Workers线程 总是保持一个稳定的数量(CPU个数 x2+2).
struct Questions Tile;

struct SelectObject choose [4];
};
由于TextOut函数不支持自动换行,所以换行 操作必须由我自己完成.因此我用同样的方法 在堆中创建了一个Screen用作屏幕显示的结 构体
Screen=new Lines[LINES]
Screen.earmark=按钮ID
客户端程序详解3
将TestPaper中的内容经过换行处理之后Copy到Screen结构中,并设 置好Screen.earmark,Screen.Color1, Screen.Color2
Hale Waihona Puke Baidu在主窗口的消息循环的WM_PAINT消息中将Screen.Line显示在窗口 中
客户端每隔10秒钟自动保存一次数据,以防突然死 机之类的情况,死机后再次登陆,程序会自动加载你 先前保存的作答.但点击”提交试卷”后就无法登 陆了.
END
谢谢
或是标点时,就HanChar++.一行文字扫描完后需要另起一行 时,判断HanChar的奇偶性,当为奇数时行宽往里缩进一个字节, 以避免以上情况.
客户端程序总结
由于客户端界面采用大量计算,显示的内容不会是 固定的模式,他会根据题目的长短变化作出相应调 整,以达到最好的显示效果.
当用户登陆验证成功之后,服务器会抛一个时间计 数,客户端通过一个定时器,每隔1秒钟将计数减1, 并显示倒计时在界面上,直到计数为0,表明考试结 束,程序自动保存数据退出.这样做的好处是用户更 改客户端的时间,不会影响程序的正常计时.
服务器程序总结
数据库被单独存放在一个服务器中可以保证数 据安全性
程序会将客户端的一切操作显示在窗口中,用户 可以通过观察窗口,知道所有客户端的动作.
这个程序采用”完成端口”模型,可以满足大规 模的考试需求.
客户端程序详解1
窗口完全采用Win32API函数生成 主要包含一下标准控件 static控件 Edit控件 Button控件 Scroll控件 窗口元素全部采用计算后的相对坐标定位,所以
服务器程序详解4
数据库的操作实现: 这部分功能主要是通过WinSocket32 API和ODBC API结合使用来 实现的,服务端进入监听状态后,为每个客户端提供相应线程处理发过 来的指令,通过分析指令,作出以下相应的操作 客户端发送的指令(自定义的): login: 登陆校验 参数:用户名,科目,密码
TextOut(hdc,x,cyhar*i,Screen.Line,strlen(Screen.Line)); 并检查Screen.earmark中是否为零,不为零就 ShowWindow(hWndList[Sreen.earmark/10-1]
[Screen.earmark%10-1],1); Screen.Color1, Screen.Color2是否为1,是就改变颜色显示.
屏幕宽度=客户区的宽/每个文字的宽度/2*2
屏幕高度=客户区的高/每个文字的高度
为每一体产生4个互斥的按钮
按钮总数= QuestionNum*4
在堆中生成hWndList数组保存按钮handle
hWndList=new hWnd [QuestionNum*4]
按钮ID=题号*10+选项号
struct Lines{

int earmark; //用来存储Button的ID

BOOL color1;//置颜色标志

BOOL color2;//置颜色标志

char Line [512];
};
LINES=扫描TestPaper中超过屏幕宽度的 行数+ QuestionNum*5+QuestionNum*3
800X600和1024X768下均能正常显示.
客户端程序详解2
试卷的初始化
考虑到每张试卷的题目数量都不同,为了节约内存 空间,所以我在堆中动态生成了一个试卷结构 体,通过向服务器程序发送GetNum:指令来 获得试卷总题数QuestionNum,然后使用 TestPaper=new TestRubric [QuestionNum]
大型作业答辩
考试程序”客户端/服务器模式”制作详解
程序组成结构
服务器程序: 1.采用了WinSocket32
的完成端口模型(I/O completion ports) 2.WIN32多线程技术 3.ODBC APIS 进行数据 库操作 客户端程序: 1.用Win32 API函数构造 主窗体和界面元素
/*结构体定义*/
//试卷每道题的结构
struct Questions{

BOOL state;

char Text [512];
};
struct SelectObject{

BOOL state;

char Text[256];
};
struct TestRubric{

服务器程序详解
完成端口模型(I/O complrtion ports)是迄今为止最为复杂的一 种I/O模型,假如一个程序需要管理为数众多的套接字,那么采用这 种模型往往可以达到最佳的系统性能,不幸的是该模型只适用与 WIN2000和WINNT操作系统,因其设计的复杂性,只有在你的应 用程序需要同时管理数百乃至上千个套接字的时候,而且希望随着 系统内安装的CPU的数量增多,应用程序的性能也可以线性的提升, 才考虑采用”完成端口模型”(WEB服务器便是这方面的典型例 子.), I/O complrtion ports是唯一适用于高负载服务器的一个技 术,它利用一些线程帮助平衡”I/O请求”所引起的负载,这样的构 架特别适合应用在SMP系统中产生所谓的”Scalable”服务 器.(Scalable是指能够籍着增加RAM或磁盘空间,CPU个数而提升 应用程序效能的一种系统).
客户端程序详解3
换行中存在的问题: 行宽=客户区的象素宽/每个文字的宽度/2*2 是偶数 汉字占用双字节,字母和标点符号占用单字节. 一行文字=字母+标点+汉字 (有可能产生奇数宽) 当一行文字产生一个奇数宽,最后一个字符又是汉字的时,就会把这
个汉字切成两份,另一半会在下一行中显示,这就造成了乱码. 我的解决办法是在换行时增加一个变量HanChar=0,当扫描到字母
相关文档
最新文档