17

我一直在查看SocketServer. 我从文档中复制了 TCP 服务器代码,它运行良好。但是,我注意到每当我在终端中按 ctrl-c 退出程序,然后尝试再次运行它时,我都会收到以下错误:

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

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

server.allow_reuse_address = True

即使添加了上述行,我仍然遇到同样的问题。我还在我的函数周围添加了一个tryand ,捕获 KeyboardInterrupt 异常并调用并希望该地址将被释放。exceptserver.serve_forever()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()

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

我在运行 Raspbian "Wheezy" 7.0 的 RaspberryPi 上使用 Python 2.7.3 运行此代码。

4

1 回答 1

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

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

于 2013-05-20T02:41:38.390 回答