homework-05
无聊的时候怎么办? ---玩游戏吧
玩游戏不够档次怎么办?? ---自己写游戏吧
做不出游戏怎么办??? ---凉拌
所以,为了防止无聊,就写个游戏吧!
游戏内容:猜数字
所有游戏者提交一个数字,最接近平均数*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相比还是有些不足。如果要制作一个支持上万人同时在线的游戏,传统的高效的程序设计是必不可少的。