从ThreadingTCPServer优雅地关闭

6 投票
1 回答
5485 浏览
提问于 2025-04-16 00:33

我创建了一个简单的测试应用程序(Python 2.6.1),它运行一个ThreadingTCPServer,参考了这个例子。当客户端发送“bye”这个命令时,我想关闭服务器并干净利落地退出应用程序。退出的部分工作得还不错,但当我尝试重新运行这个应用时,我遇到了:

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

我尝试了这里提供的解决方案,设置套接字选项,但似乎没有什么帮助。我尝试了各种关闭服务器的方法,但总是得到同样的错误。

你知道我哪里做错了吗?

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 个回答

1

如果你还没有找到答案,我觉得这个可能会帮到你...

如何关闭一个被终止程序留下的打开的套接字?

不过,这个解决办法和Alex提供的相同,所以也许这只是个机会来关闭一个旧问题。

撰写回答