作业要求

  这次作业要求实现一个黄金数游戏服务器,游戏流程如下,每个client向服务器提交一个有理数,服务器接收到所有客户端的提交后计算这些数字的平均数,再将其乘以黄金分割得到一个GoldNumber,将Client按照其提交有理数与GoldNumber接近程度排序,最接近的人将获得胜利。在实现上述要求后,还可实现client提交两个有理数进行游戏方式,客户端的成绩按其提交数中最接近黄金数的进行计算。

  

接口设计  

  话不多少,先展示接口设计,这次我们的作业采用较为底层的TCP协议作为通信方式,TCP协议具有更快的传输速度,而且作业要求在交互上并不复杂,并且要求能快速进行游戏,因而直接使用Socket在性能与稳定性上会有相当大的优势,在接口设计上我们采用了命令行格式作为基础,所有命令都为“Command [Param ]"的形式,client与server之间的通信也采用明文传输,这样做更易于调试发现错误,有助于短期内构造更健壮web应用,我们设计的接口包含如下命令:

接口名 接口形式 功能描述 样例
Register REGT username password 向服务器注册用户 REGT xiaozhang 123456
Login LOGT username password 用户注册后可使用注册的用户名及密码进行登陆   LOGN xiangzhang 123456
Commit CMMT [number] 用户登陆后在游戏过程中可向服务器提交数字 CMMT 99.0;CMMT 91 11
Logout LGOT 用户登陆后注销,注销后用户可以重新登陆 LGOT
Exit EXIT 退出游戏,断开与服务器连接 EXIT
Begin BEGN info 服务器广播命令,宣布游戏开始 BEGN Round 1
Result RSLT CurrentGrade Grade GoldNumber 服务器广播命令,给每个客户端反馈结果 RSLT 10 27 61.789

  如果client需要访问全局状态,及每个参与者的得分情况,Server为此开放了一个WebSocket接口,每一轮结束后WebSocket会广播当前比赛的状态,数据使用json进行传播,接口如下

{
"GoldNumber":number,
"SortedGrade":
[{"Item1":"name","Item2":number}],
"SortedRoundGrade":
[{"Item1":"name","Item2":number}],
   "result":
     [{"Item1":"name","Item2":number}]
}

  json在绝大部分语言下都有高效的解析工具,而且json更小更有利于快速传输,我们的DisplayPage展示网页即使用该接口。

模块设计

  这次作业我们计划使用面向对象的方法,并采用MVC的设计模式,但在具体编码时我们发现我们的框架并没有很好的区分Controler和Module,由于Module的功能非常简单,所以我们设计时将其纳入Controler的范畴,但实际上Module需要处理很多复杂的逻辑,这是我们再开始时未曾预见的,在复审时我们才着手解决由此产生的一些问题。我们模块设计如下:

  PlayServer是服务器的核心,所有其他模块都有PlayServer控制,UserModule进行用户数据的管理与审计,每次开启或关闭服务器该模块会对一个用户文件进行读写,实现用户数据的持久化,同时该文件采用密文保存,保证了一定的安全性,PlayEngine实现了游戏的主要逻辑,包括计算黄金数,计算每个Client的分数等等,DisplayServer是一个轻量级的WebSocket服务器,它负责将PlayEngine中的结果数据JSON序列化,并在WebSocket接口上进行广播。

  每个Client连接服务器后会家里相应的Session,Session会保存客户端的登陆及提交信息,并且会根据服务器的一些限制尽心访问控制,例如为了保证游戏有序进行,游戏开始后Session将会拒绝新用户的登陆,在这一部分的设计中我们没有估计到大量需要处理的错误信息,对于这些情况我们都采用了直接判断的方式,在代码复查时我们使用异常的控制方式对一部分代码进行了重构。

感想

  这次游戏设计算是该项课程开课以来任务最艰巨的的一次了,在实现服务器的工程中用到了大量非常生疏的技术,Socket通讯方式,MVC设计模式,网络协议设计,WebSocket技术,Javascript前段技术,完成了完整的游戏后,我对计算机工程实践也有了一些更新的认识,在大学前半段的学习中,我们更多的是学习语言和算法数据结构, 这两者相辅相成,语言需要实现算法来锤炼,算法的复杂与强大一度让我感觉在计算领域算法无所不包,但在进行了大量工程性的实践过后,我发现很多问题并不能用前者的思维方式很好的解决,算法有一个经典的定义——一个有穷规则的集合,所以说算法仅是一组规则,仅仅利用规则的表述方式我想很难解决现实生活中的业务问题,在这方面应该需要新的工具,但这还是我未能很好掌握的。

homework-05 GoldNumberServer的更多相关文章

  1. Machine Learning, Homework 9, Neural Nets

    Machine Learning, Homework 9, Neural NetsApril 15, 2019ContentsBoston Housing with a Single Layer an ...

  2. STAT UN2102 Homework

    STAT UN2102 Homework 4 [100 pts]Due 11:59pm Monday, May 6th on CanvasYour homework should be submitt ...

  3. Final阶段第1周/共1周 Scrum立会报告+燃尽图 05

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484] 版本控制:https://git.coding.net/liuyy08 ...

  4. 20181009-6 选题 Scrum立会报告+燃尽图 05

    Scrum立会报告+燃尽图(05)选题 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2195 一.小组介绍 组长:刘莹莹 ...

  5. 20181120-8 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 05

    此作业要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2413] 版本控制地址    [https://git.coding.ne ...

  6. 20181113-7 Beta阶段第1周/共2周 Scrum立会报告+燃尽图 05

    作业要求https://edu.cnblogs.com/campus/nenu/2018fall/homework/2387 版本控制https://git.coding.net/lglr2018/F ...

  7. 20181016-4 Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 05

    作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2288 Scrum master:王硕 一.小组介绍 组长:王一可 组员:范 ...

  8. C语言|博客作业05

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9825 我在这个课程的 ...

  9. day38-IO流05

    JavaIO流05 4.常用的类04 4.4节点流和处理流03 4.4.8打印流-PrintStream和PrintWriter 打印流只有输出流,没有输入流 1.简单介绍及应用 PrintStrea ...

  10. Java学习笔记(05)

    目录: static的用法 主函数的定义 增强for的循环 单例设计模式 封装 一.Static的用法 1.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...

随机推荐

  1. STL容器的效率比较

    1.介绍 顺序存储容器 : string.vector.list.deque 关联存储容器:map底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入 ...

  2. VS2010中如果忘记函数所在的头文件或者忘记函数的输入输出参数类型怎么办?

    先随便找一个熟悉的函数,右击-转到定义,然后写出目标函数,右击-转到定义

  3. Mysql分支

    MySQL是历史上最受欢迎的免费开源程序之一.它是成千上万个网站的数据库骨干,并且可以将它(和linux)作为过去10年里Internet呈指数级增长的一个有力证明. 那么,如果MySQL真的这么重要 ...

  4. WTL汉化版2013.10.15

    汉化内容: 2013.10.15 版本:当前可下载Trunk最新版,wtl-code-467-trunk.zip 汉化内容: 1.应用向导的部分汉化,考虑到部分词汇的表述问题,只汉化无影响部分 2.资 ...

  5. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  6. mysql使用经验总结

    在工作中难免会遇到一些这个问题那个问题,当然在mysql中也不例外.今天就让我们来学学mysql中一些比较常用的东西  . 1.有时我们想去查某张表中的字段,但是表中的数据多,字段也很多,如果用sel ...

  7. ioctl用法详解 (网络)

    本函数影响由fd参数引用的一个打开的文件. #include#include int ioctl( int fd, int request, .../* void *arg */ );返回0:成功   ...

  8. Linux下的sniffer工具--TcpDump的安装和使用

    在如今众多的黑客技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一. 用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共 ...

  9. hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online

    这是一道标准的模板题,所以拿来作为这一段时间学习最短路的总结题目. 题意很简单: 有多组输入数据,每组的第一行为两个整数n, m.表示共有n个节点,m条边. 接下来有m行,每行三个整数a, b, c. ...

  10. [转] ArcGIS engine中气泡标注的添加、修改

    小生 原文 ArcGIS engine中气泡标注的添加.修改! 你微微地笑着,不同我说什么话.而我觉得,为了这个,我已等待得久了.                                   ...