Python socketserver-允许\u重用\u地址在不重写类变量的情况下重新绑定不工作的现有端口号
我正在使用Python socketserver-允许\u重用\u地址在不重写类变量的情况下重新绑定不工作的现有端口号,python,python-3.x,Python,Python 3.x,我正在使用socketserver模块编写一个简单的socket服务器,除了一件小事之外,其他一切似乎都很好。我将服务器绑定到某个端口,然后将server.allow\u reuse\u address=True设置为重用同一端口,而不必等待内核释放底层端口。但是,如果在创建服务器实例后修改变量server.allow\u reuse\u address=True,则不起作用,但如果为服务器创建自定义类,然后覆盖其中的变量,则一切都会起作用 class MyTcpServer(socketser
socketserver
模块编写一个简单的socket服务器,除了一件小事之外,其他一切似乎都很好。我将服务器绑定到某个端口,然后将server.allow\u reuse\u address=True
设置为重用同一端口,而不必等待内核释放底层端口。但是,如果在创建服务器实例后修改变量server.allow\u reuse\u address=True
,则不起作用,但如果为服务器创建自定义类,然后覆盖其中的变量,则一切都会起作用
class MyTcpServer(socketserver.TCPServer):
allow_reuse_address = True
def __init__(self, address, request_handler_class):
self.address = address
self.request_handler_class = request_handler_class
super().__init__(self.address, self.request_handler_class)
下面是我的代码
import socketserver
import sys
class MyTCPRequestehandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024)
while self.data:
print('Received {} from {}'.format(self.data.decode().strip(), self.client_address))
self.request.send(self.data.upper())
self.data = self.request.recv(1024)
if __name__ == '__main__':
try:
server = socketserver.TCPServer(('', 12345), MyTCPRequestehandler)
ip, port = server.server_address
server.allow_reuse_address = True
print(server.allow_reuse_address)
print('Server listening on port {}'.format(port))
# server.handle_request()
server.serve_forever()
except KeyboardInterrupt:
sys.exit()
如果在断开连接后重新运行应用程序,就会出现此错误
File "/Documents/PythonPrograms/network-modules/socketServer/simplesocketserver.py", line 16, in <module>
server = socketserver.TCPServer(('', 12345), MyTCPRequestehandler)
File "/spare/ssd/rbhanot/anaconda3/lib/python3.6/socketserver.py", line 453, in __init__
self.server_bind()
File "/spare/ssd/rbhanot/anaconda3/lib/python3.6/socketserver.py", line 467, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use
那么,我在这里遗漏了什么呢?这是预期和记录的行为。发件人: 类变量,这些变量可能被派生类或 实例:
- 超时
- 家庭住址
- 插座式
- 允许\u重用\u地址
server\u bind()
,该函数检查allow\u reuse\u address
变量,并在需要时相应地执行setsockopt
如果稍后更改,则在实例初始化之后不会进行进一步检查,这意味着您的更改不会影响任何内容 谢谢你的回答-我也有同样的问题,你的解释帮助我重新解释了文档:“这默认为False,可以在子类中设置以更改策略。”。具体来说,它应该在您描述的子类中设置,而不是子类的实例。