零、准备工作

  队伍成员:梁杰,夏天晗,谢祖三。

  周五晚上吃完饭,我们就开始了讨论。

  这次的要求是写服务器,客户端以及游戏结果动态显示。很明显是三个部分,我们也就顺其自然, 一人一个部分。我负责服务器,夏天晗负责游戏结果显示,谢祖三负责客户端。

  我们使用的语言是Python,Python简洁明了,写起来很流畅。

  这次我们并没有像前两次一样大家一起编程,而是分配完任务之后大家分别完成最后再一起测试。主要考虑到实际开发中团队成员不可能每次都在一起开发,所以我们也想模拟一下“分布式开发”,深入感受一下。

一、具体思路

  虽然是“分布式开发”,但是开始仍然要进行讨论。经过我们的讨论,第5次作业的难点大概有这些:

  难点1:服务器和客户端如何通信

  服务器和客户端通信是重中之重,如果这个搞不定那后面都不用做了。对于这个问题,我们的主要思路是为客户端和服务器定义一套命令规则,比如客户端发送的数据如果以“check”开头,服务器就会返回当前的状态;如果以“sign”开头,服务器就会注册用户。同样,客户端也会根据服务器返回的数据执行不同的操作。

  难点2:服务器和展示页面如何通信

  这个也是一个大问题,我们参考了其他开发教程中服务器和页面的开发模式,最后决定采用数据接口来解决。数据接口就是说服务器和页面约定好一种数据格式,然后当页面访问服务器时,服务器就按照约定好的格式返回数据,页面再进行解析并显示。

  难点3:如何应对多客户端

  我们想做的是真正实用的服务器,所以只能处理单客户端是肯定不够的。对于多客户端,最直接的思路就是多线程。由于Python对多线程的支持非常好,我们实现起来也不是特别难。

  难点4:大家如何协同开发

  这是我们关注的一个重点,也是我们希望学到东西的一个环节。讨论完之后就进入开发阶段,大家如何在身处不同地方的情况下协同开发,我们并没有一个成熟的方案。不过经过我们的讨论,最后还是决定采用“同时开发”,“连环组合”,“统一测试”的方案。“同时开发”是指分配完任务之后大家同时完成自己的任务;“连环组合”是指大家完成自己的任务之后,一环一环进行组合,首先是客户端服务器组合,然后是服务器页面组合,确保出现问题可以第一时间定位;“统一测试”是指组合完成并成功运行之后,大家一起进行测试,看看在多机情况下是否可以正常运行。

  

二、实际编写

   由于这次是分布式开发,所以每个人对其他人的开发过程并不是很了解,只记录自己的开发过程。

  我开发的是服务器,主要使用的是Python的thread和socket两个库。因为自己之前没有写过服务器,所以从网上找了很多资料来学习如何使用Python编写服务器。看了很多教程之后慢慢有了头绪,按照示例代码来一点一点修改,自己的服务器雏形就出来了。

  然后根据上面提到的几个难点,分别实现了多线程、命名规则和数据接口,接下来就是“连环组合”部分了。

  组合并没有出问题,但是谢祖三的一句提醒让我发现了一个很严重的问题:作业要求并没有完全满足。因为之前开发时候只考虑服务器的核心功能了,并没有考虑诸如两种游戏模式、用户名重复、防DDOS等要求。发现问题之后我马上进行修改,虽然过程中出了一些小问题,但是最后还是成功搞定!

  最后统一测试的时候也不像我们想象的那么顺利。本来我们考虑用路由器,但是连上路由之后发现互相都无法ping通,更不用说玩游戏了。后来折腾了半天,用网线互联搞定了。还得感谢谢祖三同学带了一根网线过来……

三、测试功能

  采用人工测试。

  

  首先开启服务端:

$ python goldserver.py 1

  

  可以看到服务器开启成功,正在等待客户端连接。

  1是指第一种游戏类型,也就是每个用户提交1个数字。如果参数改成2就是第二种游戏类型。

  这里说明一下,游戏进行中也是可以连接服务器的,但是这样的话新连接的客户端成绩是0,对于其他客户端来说可能不太公平,所以我们留了一段时间来让所有客户端连接服务器,然后统一开始游戏。

  然后我们运行自动连接脚本,将所有客户端连接到服务器:

$ python auto_play.py

  我们可以看到有大量客户端连接到了服务器:

  然后稍等一会,游戏就开始了:

  可以看到服务器会输出游戏轮数,每轮黄金点。

  

  然后我们来看看页面展示,打开result.html,可以看到上面是动态黄金点的表:

  这个表会随着游戏进行自动更新。

  

  页面下方是动态用户排名:

  

  同样会自动更新。

 

四、总结

  这是我们第三次结对编程,这次并没有采用之前的一起编程的方式,而是创新的采用了一种“分布式编程”的方式来完成作业。虽然大家实际开发中遇到了很多没有想到的问题,但是通过我们的努力,所有的问题都被克服了。总的来说,这次的作业完成的比较满意,老师的要求也全部达到了。

五、独特之处

  这里单独把独特之处列出来,方便大家查看。

  

  多线程:

    多线程是处理高并发客户端的利器,如果没有多线程很难保证在较短的游戏时间内处理所有用户请求。

  命令规则:

    命令规则是指客户端和服务器之间通信的标准。我们采用的主要是类命令的格式,所以叫做命令规则。例如:sign username password 就是注册用户的命令,play username password 34 就是参与游戏的命令。这种方式简单有效,便于开发。

  数据接口:

    数据接口主要是处理服务器和页面间的通信。我们约定的数据类型是json格式,也就是说每当页面向服务器请求数据时,服务器会将所有黄金点以及当前用户排名封装成json格式数据返回给页面,然后页面解析json数据并进行更新。

  动态更新:

    动态更新主要是在页面内部使用js来进行高频访问,从而保证随服务器的游戏进程动态更新黄金点和用户排名。

  

六、时间统计

Personal Software Process Stages

时间百分比(%)

实际花费的时间 (分钟)

原来估计的时间 (分钟)

计划

 10%  36    24

·         估计这个任务需要多少时间,把工作细化并大致排序

 10%  36  24

开发

 85%  306  204

·         需求分析 (包括学习新技术)

 15%  54  36

·         设计复审 (和同事审核设计文档)

 10%  36  24

·         代码规范 (制定合适的规范)

 5%  18  12

·         具体设计

 10%  36  24

·         具体编码

 35%  126  84

·         代码复审

 5%  18 12

·         测试(自我测试,修改代码,提交修改)

 5%  18 12

总结报告

 5%  18  12
总计 100% 总用时  360
总估计的用时 240

[课程相关]homework-05的更多相关文章

  1. 【学习笔记】B站-2019-NLP(自然语言处理)之 BERT 课程 -- 相关课程笔记

    BERT 课程笔记 1. 传统方案遇到的问题 BERT的核心在于Transformer,Transformer就类似seq2seq网络输入输出之间的网络结构. 传统的RNN网络:最大的问题,因为不能并 ...

  2. Linux及安全课程——相关链接总结

    附录:学习笔记链接总结 MOOC课程学习笔记与实验: 第一周:计算机是如何工作的 第二周:操作系统是怎么工作的 -- 一个简单的时间片轮转多道程序内核代码及分析 第三周:构造一个简单的Linux系统M ...

  3. [课程相关]homework-04

    零.准备工作 这次的作业仍然是结对编程,我们队伍的成员为:梁杰.夏天晗.谢祖三.上次我们是选择了一个时间大家聚在一起进行编程,效果不错,所以这次我们还是决定采用这种方式.由于大家平时比较忙,这周六日我 ...

  4. [课程相关]homework-02

    一.如何组织代码 因为这个代码比较简单,用函数就足够了,个人觉得没必要用类,杀鸡不必用牛刀. 代码有点长,主要是加了很多判断参数的部分. 提取了一个公共的递归函数. 用了不少全局变量,可能当做参数传入 ...

  5. 潭州课堂25班:Ph201805201 django 项目 第四十二课 后台 课程相关,用户组管理 (课堂笔记)

    在线课程: 当点击进入页面时,显示所有课程 def get(self, request): courses = Course.objects.select_related('category', 't ...

  6. [课程相关]附加题——stack的理解

    一.stack的三种解释 stack有三种解释,我个人理解如下. 1.用户自定义的stack 用户自定义的stack就是一般意义上的后进先出队列,从名字上就能理解了,stack由下向上增长,有一个顶指 ...

  7. [课程相关]homework-09

    零.前言 这次的作业比较特殊,有两种做法.由于我对网页很熟悉,所以选择网页. 细节不赘述,下面写一下这次作业的几个亮点. 一.亮点 最大的亮点就是这个页面是纯客户端的,没有服务端.也就是说所有功能都是 ...

  8. [课程相关]homework-06

    一.c++11 lambda /* * File: main.cpp * Author: liangjie * * Created on 2013年11月23日, 下午12:02 */ #includ ...

  9. [课程相关]homework-08

    一.变量作用域和生命周期 #include <cstdlib> #include <iostream> using namespace std; void try_change ...

  10. [课程相关]homework-07

    我读的博客: C++11中值得关注的几大变化 C++11 中的线程.锁和条件变量 C++开发者都应该使用的10个C++11特性 开始使用C++11的9个理由 我的问题: 1.有一句话:“C++像难懂的 ...

随机推荐

  1. CentOS6 root 用户 vi/vim 无法开启高亮

    编辑 /etc/profile.d/vim.sh if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n &quo ...

  2. redis.conf的配置

    daemonize yes   :  redis server 实例是否以后台方式运行 , no:不以后台方式运行(默认) , yes:以后台方式运行. requirepass 密码 :  密码最好长 ...

  3. linux socket中的SO_REUSEADDR

    Welcome to the wonderful world of portability... or rather the lack of it. Before we start analyzing ...

  4. 删除ArrayList中的元素

    菜鸡重大发现:删除arraylist时,每删除一个元素后面的元素会自动填充 public static void main(String[] args) { List<String> li ...

  5. POJ 3660 Cow Contest (最短路dijkstra)

    MPI Maelstrom 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/G Description BIT has recen ...

  6. HDU 5753 Permutation Bo (推导 or 打表找规律)

    Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...

  7. STM32的GPIO使用的函数剖析

    转载http://blog.csdn.net/wuwuhuizheyisheng/article/details/8239599 STM32的GPIO总结 作者:JCY 该文是自己学习了一段STM32 ...

  8. MSSQL导入数据时,出现“无法截断表 因为表正由Foreign key引用”错误

    * 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] ”失败,错误如下:“无 ...

  9. CodeForces 732B Cormen — The Best Friend Of a Man (贪心)

    题意:给定n和k表示,狗要在任意连续两天散步次数要至少为k,然后就是n个数,表示每天的时间,让你增加最少次数使得这个条件成立. 析:贪心,策略是从开始到最后暴力,每次和前面一个相比,如果相加不够k,那 ...

  10. EasyUI datagrid添加右键菜单项

    js代码 //动态加载数据表格 function InitData() { $('#grid').datagrid({ url: '/Home/Query?r=' + Math.random(), / ...