您的位置:首页 > 其它

homework-05

2013-11-03 16:17 204 查看
无聊的时候怎么办? ---玩游戏吧

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

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

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

游戏内容:猜数字

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

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



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

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

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

{

Para1: value1,

Para2: value2

}



Para1=value1¶2=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相比还是有些不足。如果要制作一个支持上万人同时在线的游戏,传统的高效的程序设计是必不可少的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: