homework-05 GoldNumberServer
作业要求
这次作业要求实现一个黄金数游戏服务器,游戏流程如下,每个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的更多相关文章
- Machine Learning, Homework 9, Neural Nets
Machine Learning, Homework 9, Neural NetsApril 15, 2019ContentsBoston Housing with a Single Layer an ...
- STAT UN2102 Homework
STAT UN2102 Homework 4 [100 pts]Due 11:59pm Monday, May 6th on CanvasYour homework should be submitt ...
- Final阶段第1周/共1周 Scrum立会报告+燃尽图 05
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484] 版本控制:https://git.coding.net/liuyy08 ...
- 20181009-6 选题 Scrum立会报告+燃尽图 05
Scrum立会报告+燃尽图(05)选题 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2195 一.小组介绍 组长:刘莹莹 ...
- 20181120-8 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 05
此作业要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2413] 版本控制地址 [https://git.coding.ne ...
- 20181113-7 Beta阶段第1周/共2周 Scrum立会报告+燃尽图 05
作业要求https://edu.cnblogs.com/campus/nenu/2018fall/homework/2387 版本控制https://git.coding.net/lglr2018/F ...
- 20181016-4 Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 05
作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2288 Scrum master:王硕 一.小组介绍 组长:王一可 组员:范 ...
- C语言|博客作业05
这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9825 我在这个课程的 ...
- day38-IO流05
JavaIO流05 4.常用的类04 4.4节点流和处理流03 4.4.8打印流-PrintStream和PrintWriter 打印流只有输出流,没有输入流 1.简单介绍及应用 PrintStrea ...
- Java学习笔记(05)
目录: static的用法 主函数的定义 增强for的循环 单例设计模式 封装 一.Static的用法 1.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...
随机推荐
- Tomcat原理 分类: 原理 2015-06-28 19:26 5人阅读 评论(0) 收藏
Tomcat的模块结构设计的相当好,而且其Web 容器的性能相当出色.JBoss直接就使用了Tomcat的web容器,WebLogic的早期版本也是使用了Tomcat的代码. Web容器的工作过程在下 ...
- css实现缩进无限嵌套
使用css实现缩进带背景无限嵌套,支持Ie6,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- mac下git中文乱码
今天从window切mac,git使用时各种问题.典型的就是,git commit 可以使用中文注释,但是使用 git log 查看的时候发现都是乱码,乱码效果如下: <B1><E0 ...
- Request.Querystring中文乱码问题解决
现象:近期项目中用到查询字符串传值,如果传递的是英文一切正常,但是传递中文时,使用request.querystring[]得到的是乱码. 原因:不知道为什么,可能是编码不一致问题 解决方法1:修改w ...
- [反汇编练习] 160个CrackMe之009
[反汇编练习] 160个CrackMe之009. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- nginx - ssl 配置 - globelsign ssl
前提: 3个文件 - domain.csr.domain.key.xxx.cer 简述: 1. 本地生成 .key文件 [附件] 2. 再利用key文件,生成csr(certificate Secu ...
- 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) ...
- .gitignore的使用:首次创建及事后添加无法生效.
问题:使用sourceTree做版本管理后, Xcode工程每次打开, 都会有几个xcodeworkspace之类的文件提示改动了. 如果想ignore掉, 有两种情况: 1:整个工程没有纳入版本管理 ...
- <六>面向对象分析之UML核心元素之业务实体
一:基本概念
- 【转】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 ...