从客户端线程(线程,python)修改服务器变量 [英] Modify server's variable from client's thread (threading, python)
问题描述
我用Python实现了一个简单的网络游戏"-服务器绘制一个随机数,然后客户端尝试猜测它.我的应用程序运行良好,当客户端猜出该数字时,它将与服务器断开连接(由客户端处理).
I implemented a simple network 'game' in Python - server draws a random number, and then the client tries to guess it. My application works great, when the client guesses the number, it disconnects from server (it is handled on client's side).
但是,经过适当的猜测之后,数字仍然相同.我想修改该应用程序,以便当客户端猜出该数字时,服务器应随后借出一个新数字,以便其他客户端猜出该新数字.我该怎么办?
However, after the proper guess, the number is still the same. I would like to modify the application, such that when the client guesses the number, the server should then rand a new number, so other clients should guess the new one. How can I do this?
一些模板,只是为了引起注意:
Some template, just to draw an attention to the problem:
#!/usr/bin/env python
from random import randint
import socket, select
from time import gmtime, strftime
import threading
import sys
class Handler(threading.Thread):
def __init__(self, connection, randomnumber):
threading.Thread.__init__(self)
self.connection = connection
self.randomnumber = randomnumber
def run(self):
while True:
try:
data = self.connection.recv(1024)
if data:
print data
try:
num = int(data)
if Server.guess(num) :
msg = "You won! This is the right number!"
self.connection.send(msg)
break
else :
msg = "Try again!"
self.connection.send(msg)
except ValueError, e:
msg = "%s" % e
self.connection.send(msg)
else:
msg = "error"
self.connection.send(msg)
except socket.error:
self.connection.close()
break
self.connection.close()
class Server:
def __init__(self, ip, port):
self.ip = ip
self.port = port
self.address = (self.ip, self.port)
self.server_socket = None
self.randnum = randint(1, 100)
@classmethod
def guess(cls, no):
if cls.randnum == no:
cls.randnum = randint(1, 1000)
result = True
else:
result = False
return reslut
def run(self):
try:
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((self.ip, self.port))
self.server_socket.listen(10)
print 'Num is %s' % self.randnum
while True:
connection, (ip, port) = self.server_socket.accept()
c = Handler(connection, self.randnum)
c.start()
except socket.error, e:
if self.server_socket:
self.server_socket.close()
sys.exit(1)
if __name__ == '__main__':
s = Server('127.0.0.1', 1234)
s.run()
推荐答案
生成在服务器和所有客户端之间共享的随机数,应该仅此实例,因此应为class属性.
添加一个类函数guess
,该函数在错误的猜测时返回False
,在正确的猜测中更改randnum
并返回True
Generate the random number that is shared between both server and all the client, there should be only instance of this, hence this should be class attribute.
Add a class function guess
which return False
upon incorrect guess and upon correct guess changes the randnum
and returns True
class Server:
randnum = randint(1, 1000) # class attribute created
@classmethod
def guess(cls, no): # To be used "guess" if `no` attribute if the same as `cls.randnum`
if cls.randnum == no:
cls.randnum = randint(1, 1000)
result = True
else:
result = False
return result
def __init__(self, ip, port):
# ...
客户端每次应调用此Server.guess
函数.
The client should call this Server.guess
function each time.
这篇关于从客户端线程(线程,python)修改服务器变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!