作业要求

  这次作业要求实现一个黄金数游戏服务器,游戏流程如下,每个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. Tomcat原理 分类: 原理 2015-06-28 19:26 5人阅读 评论(0) 收藏

    Tomcat的模块结构设计的相当好,而且其Web 容器的性能相当出色.JBoss直接就使用了Tomcat的web容器,WebLogic的早期版本也是使用了Tomcat的代码. Web容器的工作过程在下 ...

  2. css实现缩进无限嵌套

    使用css实现缩进带背景无限嵌套,支持Ie6,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...

  3. mac下git中文乱码

    今天从window切mac,git使用时各种问题.典型的就是,git commit 可以使用中文注释,但是使用 git log 查看的时候发现都是乱码,乱码效果如下: <B1><E0 ...

  4. Request.Querystring中文乱码问题解决

    现象:近期项目中用到查询字符串传值,如果传递的是英文一切正常,但是传递中文时,使用request.querystring[]得到的是乱码. 原因:不知道为什么,可能是编码不一致问题 解决方法1:修改w ...

  5. [反汇编练习] 160个CrackMe之009

    [反汇编练习] 160个CrackMe之009. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. nginx - ssl 配置 - globelsign ssl

    前提: 3个文件 - domain.csr.domain.key.xxx.cer 简述: 1. 本地生成 .key文件  [附件] 2. 再利用key文件,生成csr(certificate Secu ...

  7. Java [Leetcode 234]Palindrome Linked List

    题目描述: Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) ...

  8. .gitignore的使用:首次创建及事后添加无法生效.

    问题:使用sourceTree做版本管理后, Xcode工程每次打开, 都会有几个xcodeworkspace之类的文件提示改动了. 如果想ignore掉, 有两种情况: 1:整个工程没有纳入版本管理 ...

  9. <六>面向对象分析之UML核心元素之业务实体

    一:基本概念

  10. 【转】iOS-延迟操作方法总结

    原文网址:http://lysongzi.com/2016/01/30/iOS-%E5%BB%B6%E8%BF%9F%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95%E6%80 ...