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.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...
随机推荐
- C#基础(三)
运算符 分类 符号 解释 优先级 算数 ++,—— 加加,减减 由高到低,即执行顺序由上到下(圆括号优先级最高) * /% 乘 除 取余 + - 加 减 关系 关系和逻辑运算符永远是布尔型 > ...
- Javascript如何判断一个变量是数字类型?
isNaN()不能判断一个变量是否为数字类型,isNaN(123)值为false,isNaN('123')值也为false.isNaN() 的实际作用跟它的名字isNaN并不一致,isNaN(NaN) ...
- SQLserver游标原理和使用方法
在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录.那么如何解决这种问题呢 ...
- 一个简单的iBatis入门例子
一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...
- 类Item_field
class Item_field :public Item_ident { protected: void set_field(Field *field); public: Field *field, ...
- ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-dat ...
- iOS应用的crash日志的分析基础
Outline如何获得crash日志如何解析crash日志如何分析crash日志 1. iOS策略相关 2. 常见错误标识 3. 代码bug 一.如何获得crash日志 ...
- USACO1.4.1 Packing Rectangles
//毕竟我不是dd牛,USACO的题解也不可能一句话带过的…… 题目链接:http://cerberus.delos.com:790/usacoprob2?a=pWvHFwGsTb2&S=pa ...
- Java—Map.Entry
Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法. keySet()方法返回值是Map中key值的集合:e ...
- [Everyday Mathematics]20150201
设数列 $\sed{a_n}$ 单调递减趋于零, 证明 $\dps{\vsm{n}a_n}$ 收敛当且仅当 $\dps{\vsm{n}3^k a_{3^k}}$ 收敛.