homework-05

无聊的时候怎么办? ---玩游戏吧

玩游戏不够档次怎么办?? ---自己写游戏吧

做不出游戏怎么办??? ---凉拌

 

所以,为了防止无聊,就写个游戏吧!

 

游戏内容:猜数字

所有游戏者提交一个数字,最接近平均数*0.618者为胜

 

由于是多人游戏,就会涉及到服务器与客户端的通信问题。这里我们就采用socket来实现

 

一个服务器对应多个客户端,命令直接通过文本的方式传送

 

为了能够更加有效的解析命令,我们就需要对传送的文本进行规范。从plain text转化成structured data。

 

为了能完成文本的转换,我们可以用http传送参数的方式完成。

{

         Para1: value1,

         Para2: value2

}

Para1=value1&para2=value2

就能够互相转换了。

 

于是,我们根据这个游戏的需求,就有了如下定义:

客户端向服务器传输的:

         newplayer                  登记玩家

                   username         用户名

         submit                        提交数字

                   point                  数字

         query                           查询

                   (None)               (无)

 

服务器向客户端传输的:

         newround                  新一轮

                   timeout             时限

                   count                 第几轮

                   yourpoint 客户端的分数

         confirmplayer  确认玩家

                   username         用户名

                   token                 身份口令

         confirmsubmit 确认提交

                   point                  点数

         confirmquery   确认查询

                   yourpoint 客户端的分数

                   lastg                   最后一次G点

                   lastwinner        上次胜利者

 

如上协议定义好了以后,程序就呼之欲出了。

 

比如我的服务器实现:

有两个类,游戏管理器和游戏玩家:

 

每当有玩家连入时,就创建一个新的线程,专门负责和那个玩家通信。

 

客户端也是类似,一个单独的线程负责接收服务器消息即可。

 

实现timeout功能就只需要服务器额外开一个线程,每sleep一段时间,调用一下game类的newRound()方法即可

 

-------------------------------以上是上节课讲台上说的内容-------------以下是重点--------------------------

压力测试:

0个客户端:

工作的相当正常

 

大哥,敢不敢更给力点?!!

10个客户端:

毫无压力~

 

100个来一发:

 

500个客户端,也同样轻松加愉快

 

800个客户端:

还是通过。

 

挑战1000个客户端!

可是,这一次发生了错误:

服务器端显示只有886个客户端连接进了服务器:

而客户端则发生了错误:

看到错误提示信息显示,不能创建新线程了。这应该就是python线程数的极限了

 

结论,如果要支持上千用户数同时连入,可以考虑用c语言重写。这也给了我们一个启示:python虽然灵活方便,可是在性能上和c相比还是有些不足。如果要制作一个支持上万人同时在线的游戏,传统的高效的程序设计是必不可少的。

posted on 2013-11-03 16:17  不想嚣张  阅读(162)  评论(1编辑  收藏  举报

导航