Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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 从ThreadingCPServer正常关闭_Python_Tcp_Socketserver - Fatal编程技术网

Python 从ThreadingCPServer正常关闭

Python 从ThreadingCPServer正常关闭,python,tcp,socketserver,Python,Tcp,Socketserver,我已经创建了一个简单的测试应用程序(Python2.6.1),它根据这个示例运行ThreadingCpserver。如果客户端发送一个命令“bye”,我想关闭服务器并从应用程序中干净地退出。退出部分工作正常,但当我尝试重新运行应用程序时,我得到: socket.error: [Errno 48] Address already in use 我尝试了为设置套接字选项提供的解决方案,但似乎没有帮助。我尝试了各种方法关闭服务器,但总是出现相同的错误 知道我做错了什么吗 import SocketS

我已经创建了一个简单的测试应用程序(Python2.6.1),它根据这个示例运行ThreadingCpserver。如果客户端发送一个命令“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.")

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


然而,这与Alex提供的解决方案相同,因此这可能只是一个结束旧问题的机会。

从程序关闭到重新启动,您需要等待多长时间?只需几秒钟。如果我等一两分钟,TCP套接字就会被释放,一切正常。稍微更新一下。通过这样做,我可以使重用地址位正常工作:SocketServer.threadingcpserver.allow_reuse_address=True,但我仍然不明白为什么服务器没有首先清理。因为您没有设置
allow_reuse_address
——您所指的SO Q的公认答案清楚地表明了这一点必要的!当然,如果您没有实际使用它,“它似乎没有帮助;-)。当我测试它时,我实际上正在使用它:)我只是在发布替代解决方案之前删除了该代码。