如果引发键盘中断,Python socketserver不会自动解除绑定

如果引发键盘中断,Python socketserver不会自动解除绑定,python,python-3.x,sockets,serversocket,Python,Python 3.x,Sockets,Serversocket,我是Python套接字服务器编程新手,我将遵循这一点使用socketserver框架设置服务器。根据注释,按Ctrl-C将停止服务器,但当我再次尝试运行它时,我得到 OSError:[Errno 98]地址已在使用中 这让我不得不使用终端手动终止进程 根据我的理解,KeyboardInterrupt在Python中被认为是一种异常类型,当和块中发生异常时,Python也会调用\uuuuuu exit\uuu()函数进行清理。我曾尝试在TCP hanlder类中创建一个\uuuuu exit\uu

我是Python套接字服务器编程新手,我将遵循这一点使用socketserver框架设置服务器。根据注释,按Ctrl-C将停止服务器,但当我再次尝试运行它时,我得到

OSError:[Errno 98]地址已在使用中

这让我不得不使用终端手动终止进程

根据我的理解,KeyboardInterrupt在Python中被认为是一种异常类型,当
块中发生异常时,Python也会调用
\uuuuuu exit\uuu()
函数进行清理。我曾尝试在TCP hanlder类中创建一个
\uuuuu exit\uuuu()
函数,但这似乎无法解决问题

有人知道在引发异常时解除套接字绑定的方法吗

server.py

import socketserver
from threading import Thread

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())
    
    # Self-written function to try to make Python close the server properly
    def __exit__(self):
        shutdown_thread = Thread(target=server.shutdown)
        shutdown_thread.start()
           

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

    # Create the server, binding to localhost on port 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        # Activate the server; this will keep running until you
        # interrupt the program with Ctrl-C
        server.serve_forever()

这不是Python的东西,这是TCP的产物。看似关闭的套接字实际上处于部分打开状态,即使在应用程序停止运行之后也是如此。要绕过这个问题,请使用

socketterver.TCPServer.allow_reuse_address = True

在创建服务器之前。这将启用覆盖此行为的SO_REUSEADDR套接字选项。

这不是Python的东西,而是TCP的产物。看似关闭的套接字实际上处于部分打开状态,即使在应用程序停止运行之后也是如此。要绕过这个问题,请使用

socketterver.TCPServer.allow_reuse_address = True

在创建服务器之前。这将启用覆盖此行为的SO_REUSEADDR套接字选项。

正如@Tim Roberts解释的那样,这是TCP的产物。除了他的方法之外,您还可以使用

socket.setsockopt(socket.SO_REUSEADDR)

当您正在传递多个
socketopt
s时,或者当您想要更熟悉C语言中的低级网络时,这可能会很有用。

正如@Tim Roberts解释的那样,它是TCP的产物。除了他的方法之外,您还可以使用

socket.setsockopt(socket.SO_REUSEADDR)

当您传递多个
socketopt
s时,或者当您想在C中使用更熟悉的底层网络时,这可能很有用。

一个解决方法可能是通过
socket使用
SO\u REUSEADDR
,我真的希望我能把你的答案和Tim Robert的答案一起标记为解决方案,但他的答案更接近我想要的。不过,谢谢你的回答和有用的补充信息。没问题!只要它能帮助你或其他人!对不起,我真的希望我能把你的答案和Tim Robert的答案一起标记为解决方案,但他的答案更接近我想要的。不过,谢谢你的回答和有用的补充信息。没问题!只要它能帮助你或其他人!