我在Python中第一次使用套接字,我遇到了问题。
我的UDP服务器有一个线程请求处理程序,但由于它的工作方式(如建议here),我无法弄清楚如何将参数传递给它。我需要它来访问应用程序中的其他对象,因为它必须通知它们网络中不同客户端执行的操作。但是,表示处理程序的类无法实例化,因此无法通过构造函数获取参数。
这是我的代码的简化版本。
class ThreadedUDPRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request[0].strip()
socket = self.request[1]
print ("{} wrote:".format(self.client_address[0]))
print (data)
#Ideally, I'd call a method of an object here
class ThreadedUDPServer(socketserver.ThreadingMixIn, socketserver.UDPServer):
pass
class ServerManager():
def __init__(self, player_box):
self.player_box = player_box
HOST, PORT = "xxx.xxx.xxx.xxx", 9999
self.server = ThreadedUDPServer((HOST, PORT), ThreadedUDPRequestHandler)
ip, port = self.server.server_address
def start(self):
server_thread = threading.Thread(target=self.server.serve_forever)
server_thread.start()
def stop(self):
self.server.shutdown()
在这种情况下,我希望请求处理程序访问的对象是player_box。目标是每次发出请求时调用该对象的方法。有没有办法做到这一点,还是应该采用不同的方法?
我注意到有一个类似的问题here,但建议的解决方案对我来说根本不起作用。事实上,对我来说没什么意义......
答案 0 :(得分:1)
这可能有点难看,但这是我最好的主意:
class ThreadedUDPRequestHandler(socketserver.BaseRequestHandler):
PLAYER_BOX = None
def handle(self):
data = self.request[0].strip()
# (...)
self.PLAYER_BOX.foo()
class ServerManager():
def __init__(self, player_box):
class ThreadedUDPRequestHandlerWithPlayerBox(ThreadedUDPRequestHandler):
PLAYER_BOX = player_box
HOST, PORT = "xxx.xxx.xxx.xxx", 9999
self.server = ThreadedUDPServer((HOST, PORT), ThreadedUDPRequestHandlerWithPlayerBox)
如您所见,这个想法有两个部分:
我希望这会有所帮助。