Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python socketserver-允许\u重用\u地址在不重写类变量的情况下重新绑定不工作的现有端口号_Python_Python 3.x - Fatal编程技术网

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地址
如果我们进一步检查源代码,我们可以看到原因。类init调用
server\u bind()
,该函数检查
allow\u reuse\u address
变量,并在需要时相应地执行
setsockopt


如果稍后更改,则在实例初始化之后不会进行进一步检查,这意味着您的更改不会影响任何内容

谢谢你的回答-我也有同样的问题,你的解释帮助我重新解释了文档:“这默认为False,可以在子类中设置以更改策略。”。具体来说,它应该在您描述的子类中设置,而不是子类的实例。