零、准备工作

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

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

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

  我们使用的语言是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. 改变seekbar的游标图片大小

    url: http://stackoverflow.com/questions/9699951/changing-size-of-seekbar-thumb The most flexible way ...

  2. POJ 1502 MPI Maelstrom(最短路)

    MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4017   Accepted: 2412 Des ...

  3. JodaTime用法简介

    JodaTime用法简介 Java的Date和Calendar用起来简直就是灾难,跟C#的DateTime差距太明显了,幸好有JodaTime 本文简单罗列JodaTime的用法 package co ...

  4. codeforce 630N Forecast

    N. Forecast time limit per test 0.5 seconds memory limit per test 64 megabytes input standard input ...

  5. 11道php面试题

    贡献11道php面试题及解决方法,跟大家总结一下曾经遇到的部分面试题.希望可以给大家得到帮助. 1. 什么事面向对象?主要特征是什么? 面象对象是把自然界的物体和概念直接映射到程序界的一种比较优雅的手 ...

  6. 如何在Android中使用OpenCV

    如何在Android中使用OpenCV 2011-09-21 10:22:35 标签:Android 移动开发 JNI OpenCV NDK 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...

  7. jQuery UI vs EasyUI

    几个UI框架的比较k: 目前工作中可能会常用到几个UI框架,如 Ext: http://docs.sencha.com/ext-js/4-1/#!/example 感觉其过于复杂,性能不高,所以一直没 ...

  8. Spring和Hibernate集成的HibernateTemplate的一些常用方法总结

    1:get/load存取单条数据 public Teacher getTeacherById(Long id) { return (Teacher)this.hibernateTemplate.get ...

  9. python函数介绍

    1.向函数传递信息 def greet_user(username): print('Hello,' + username.title() + '!') greet_user('jesse') 2.位 ...

  10. AndroidEventBus ( 事件总线 ) 的设计与实现

    1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,非常大程度上减少了它们之间的耦 ...