代码之家  ›  专栏  ›  技术社区  ›  Lynn

从threadingtcpserver正常关闭

  •  5
  • Lynn  · 技术社区  · 16 年前

    我创建了一个简单的测试应用程序(python 2.6.1),它运行一个线程化的cpserver,基于这个示例 here . If the client sends a command "bye" I want to shut down the server and exit cleanly from the application. The exit part works OK, but when I try to re-run the app, I get:

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

    我尝试了给出的解决方案 here 用于设置套接字选项,但似乎没有帮助。我尝试了各种方法关闭服务器,但总是得到相同的错误。

    知道我做错了什么吗?

    import SocketServer
    import socket
    import sys
    import threading
    import time
    
    class RequestHandler(SocketServer.BaseRequestHandler):
    
        def setup(self):
            print("Connection received from %s" % str(self.client_address))
            self.request.send("Welcome!\n")
    
        def handle(self):
            while 1:
                data = self.request.recv(1024)
                if (data.strip() == 'bye'):
                     print("Leaving server.")
                     self.finish()
                     self.server.shutdown()
                     # None of these things seem to work either
                     #time.sleep(2)
                     #del self.server.socket
                     #self.server.socket.shutdown(socket.SHUT_WR)
                     #self.server.socket.close()
                     #self.server.server_close()
                     break
    
    
        def finish(self):
            self.request.send("Goodbye!  Please come back soon.")
    
    if __name__ == "__main__":
           server = SocketServer.ThreadingTCPServer(("localhost", 9999), RequestHandler)
           # This doesn't seem to help.
           #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
           #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
           server.serve_forever()
           print("Exiting program.")
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    如果你还没有找到答案,我相信这可能有助于…

    How to close a socket left open by a killed program?

    However, this is the same solution offered by Alex, so perhaps this is just an opportunity to close an old question.