实现思路
从官方文档及其他地方并未找到合适的handle传参的方法,因此考虑重写部分类或类方法。
如果使用TCPServer启动的服务实例,则我们在注册server实例的时候就应该将参数传递过去,因此我们考虑重写下TCPServer的__init__方法:
以增加一个info参数为例
1 2 3 4 5
| class MyTCPServer(TCPServer): def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, info=None): self.info = info TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=bind_and_activate)
|
如果说仅仅是串行单Client端的情况下,我们用重写好的M有TCPServer去启动实例就满足需求了,但是大多数情况下,我们需要用到异步处理,多Client端的情况,也就是需要用ThreadingTCPServer去启动一个实例。
因此如果我们要异步,ThreadingTCPServer也需要重写一下。
先查看下原来的ThreadingTCPServer是怎么写的:
官方的写法:
1
| class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
|
很显然,ThreadingTCPServer并没有其他的操作,因此我们只需要将TCPServer换成我们已经重写好的MyTCPServer即可达到效果。
重写ThreadingTCPServer:
1 2
| class MyThreadingTCPServer(ThreadingMixIn, MyTCPServer): pass
|
最终实现的完整的代码(demo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| from socketserver import TCPServer, ThreadingMixIn, BaseRequestHandler
class MyTCPServer(TCPServer): def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, info=None): self.info = info TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=bind_and_activate)
class MyThreadingTCPServer(ThreadingMixIn, MyTCPServer): pass class Handler(BaseRequestHandler): def handle(self): print("打印传入的参数:", self.server.info) self.data = self.request.recv(1024).strip() print(self.data) if __name__ == "__main__": ADDR = ("127.0.0.1", 8089) server = MyThreadingTCPServer(ADDR, Handler, info="hahaha我是传入的参数") server.serve_forever()
|
需要注意的是,使用自己传入的参数,需要用self.server.xxx
因为server是TcpServer的对象
打印出来的我们自定义的info参数的值(效果):