SocketServer:如何解决“[Errno 98] Address already in use”问题

20

我一直在查看SocketServer的文档。我从文档中复制了TCP服务器代码并成功运行。然而,我发现每当我在终端中按下ctrl-c退出程序后,再试图运行它时,就会出现以下错误:

socket.error: [Errno 98] Address already in use

我通过阅读这个这个来了解如何解决问题。我在我的代码中添加了以下行以尝试允许地址的重复使用:

server.allow_reuse_address = True

即使我添加了上面的代码行,我仍然遇到相同的问题。我还在我的server.serve_forever()函数周围添加了tryexcept,捕获了KeyboardInterrupt异常并调用server.shutdown()server.socket.close(),希望地址会被释放。

这是我的TCP服务器代码的全部内容(注意:我排除了MyTCPHandler类):

if __name__ == "__main__":
    HOST, PORT = '', 9999

    # Create the server, binding to localhost on port 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.allow_reuse_address = True

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
        server.socket.close()

我仍然在运行上面的代码时遇到错误,并且必须等待近一分钟才能最终释放地址。当我不断地进行调试和更改我的代码时,这很令人沮丧。

我正在使用Python 2.7.3在RaspberryPi上运行Raspbian“Wheezy”7.0。

1个回答

35
...
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
...

allow_reuse_address 应该放在类上,而不是实例上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接