第五次作业的重点是服务器端的开发...
很不幸...我对于这玩意一无所知...原来做的移动智能终端——服务器式数字家庭实例这个程序用的是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=011 data.total=012 time.sleep(0.9)13 if data.num!=0:14 average=data.total/data.num*0.61815 print average16 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']=average20 data.goldpoint.append(average)21 t=1-(time.time()-start)22 time.sleep(t)23 print data.num24 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
用户注册:
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+=113 data.total+=i.num14 data.thisturn[i.id]=i.num15 return 016 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.029 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.body10 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].join11 end
主函数重复调用n次client,我将用户ID定为执行的顺序,并挨个执行命令"ruby client.rb #{id[x]}"。
最后效果还是有的...
就是这样了...特别感谢余锋伟的帮忙...