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
判断胜负与加减分:
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
用户注册:
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
这大概就是服务器端的主体了...其实这些具体功能与逻辑很好理解...对我来说困难的就是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
首先需要调用"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
主函数重复调用n次client,我将用户ID定为执行的顺序,并挨个执行命令"ruby client.rb #{id[x]}"。
最后效果还是有的...
就是这样了...特别感谢余锋伟的帮忙...