homework-05

第五次作业的重点是服务器端的开发...

很不幸...我对于这玩意一无所知...原来做的移动智能终端——服务器式数字家庭实例这个程序用的是serv-u这个自动搭建的服务器...

但又很幸运...我的小伙伴王文涛对于服务器来说比较在行...于是这次主要由他开发程序...我给他打下手...

他喜欢用python这种语言...对我来说却是门全新的语言...只能帮他改改bug神马的...

当然自己也试着读了读python的代码...

发现还是能看得懂的...

主界面与主功能...计算黄金数字:

 1 def index_page():
 2     for i in list(data.db.select('users')):
 3         print i['id']
 4     time.sleep(10)
 5     for i in list(data.db.select('users')):
 6         data.users[i['id']]=0.0
 7     while True:
 8         start=time.time()
 9         data.thisturn={}
10         data.num=0
11         data.total=0
12         time.sleep(0.9)
13         if data.num!=0:
14             average=data.total/data.num*0.618
15             print average
16             data.thisturn['winner']=score(data.thisturn,data.users,average)
17             data.winner=data.thisturn['winner']
18             data.winnernumber=data.thisturn[data.winner]
19             data.thisturn['result']=average
20             data.goldpoint.append(average)
21         t=1-(time.time()-start)
22         time.sleep(t)
23         print data.num
24         data.turn+=1
View Code

判断胜负与加减分:

 1 def score(thisturn,users,average):
 2     value_max=0
 3     value_min=100
 4     for i in thisturn:
 5         a=abs(thisturn[i]-average)
 6         if a>value_max:
 7             value_max=a
 8             max_num=i
 9         if a<value_min:
10             value_min=a
11             winner=i
12     for i in list(data.db.select('users')):
13         if i['id'] not in thisturn and i['id']!=winner:
14             users[i['id']]-=5
15         elif i['id']==winner:
16             users[i['id']]+=10
17         elif i['id']==max_num:
18             users[i['id']]-=1
19     return winner
View Code

用户注册:

 1 class attend:
 2     def GET(self):
 3         form=attendform()
 4         return render.attend(form)
 5     def POST(self):
 6         form=attendform()
 7         if not form.validates():
 8             return render.attend(form)
 9         else:
10             i=web.input()
11             i.num=string.atof(i.num)
12             data.num+=1
13             data.total+=i.num
14             data.thisturn[i.id]=i.num
15             return 0
16 
17 class register:
18     def GET(self):
19         form=registerform()
20         return render.register(form)
21     def POST(self):
22         form=registerform()
23         if not form.validates():
24             return render.register(form)
25         else:
26             i=web.input()
27             data.db.insert('users',id=i.id,pd=0)
28             data.users[i.id]=0.0
29             return 0
View Code

这大概就是服务器端的主体了...其实这些具体功能与逻辑很好理解...对我来说困难的就是python这门语言...以及服务器该如何调用各种接口...

我的主要任务是客户端的开发,由于在C#中,我没有百度到如何上传数据到url的办法,因此我选择使用刚学的ruby进行开发。

 1 require "net/http"
 2 params = Hash.new
 3 params[:id] = ARGV[0]
 4 addr = "http://192.168.1.150:8080"
 5 while true
 6     params[:num] = rand(100) + 1
 7     uri = URI.parse(addr + "/attend")
 8     res = Net::HTTP.post_form(uri, params)
 9     puts res.body
10     sleep(1+ 0.2*rand(100)/100)
11 end
View Code

首先需要调用"net/http"库,可以使用语句res = Net::HTTP.post_forri, params)将params的ID数据、num数据上传至url。

sleep(1+ 0.2*rand(100)/100)此处运用一个随机均匀算法,保证每个进程的提交时间尽量不冲突,保证了只有小部分情况使得用户提交不上去。

 1 n = 20
 2 id = Array.new(n)
 3 thread = Array.new(n)
 4 1.upto(n) do |x|
 5     id[x] = x.to_s
 6     puts id[x]
 7     thread[x] = Thread.new { system "ruby client.rb #{id[x]}"}
 8 end
 9 1.upto(n) do |x|
10     thread[x].join
11 end
View Code

主函数重复调用n次client,我将用户ID定为执行的顺序,并挨个执行命令"ruby client.rb #{id[x]}"。

最后效果还是有的...

就是这样了...特别感谢余锋伟的帮忙...

原文地址:https://www.cnblogs.com/yimingzou/p/3405713.html