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.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...
随机推荐
- OSCache 缓存技术
前言:OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能.OSCache是个一个广泛采用的高性能的J2EE缓存框架 ...
- ios开发之 MPMoviePlayerController 视频播放器
MPMoviePlayerController 与AVAudioPlayer有点类似,前者播放视频,后者播放音频,不过也有很大不同,MPMoviePlayerController 可以直接通过远程UR ...
- iOS处理XMl提供GDataXMLNode下载的链接
GDataXMLNode .好东西,处理xml 在iOS 中使用.可以编辑和读取Xml文档.支持Xpath.这个很好. GDataXMLNode.h GDataXMLNode.m 文件很不好找啊. / ...
- fil_space_create
/*******************************************************************//** Creates a space memory obje ...
- bzoj2437
会做jsoi那道game,这题就非常简单了吧 我们考虑空格的移动,显然,初始与空格位置距离为奇数的黑棋和距离为偶数的白棋并没有什么用, 空格不会移到那,我们直接把他们当作障碍,其他点我们当作可移动区域 ...
- android webview js alert对话框 不能弹出 解决办法
在配置了webview的 setting属性后,以前设置的都是可以直接弹出来的,今天写一个小demo时候莫名其妙的发现alert怎么也出来,即使设置了这么多也不行: webSettings.setJa ...
- Js 读写cookies
//写cookies函数 function setCookie(name, value)//两个参数,一个是cookie的名子,一个是值 { var Days = 30; //此 cookie 将被保 ...
- UVA 11426 GCD-Extreme(II) ★ (欧拉函数)
题意 求Σ{1<=i<N} Σ{i<j<=N} GCD(i, j) (N<=4000000) 分析 原始思路 暴力求明显是不行的,我们把式子简化形式一下发现它可以 ...
- Java [Leetcode 155]Min Stack
题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constant ti ...
- 【转】iOS开发UITableViewCell的选中时的颜色设置
原文网址:http://mobile.51cto.com/hot-404900.htm 1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSe ...