在Python中关闭/重新启动套接字

2024-05-23 13:20:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我将要做一个使用PagSeguro(巴西“PayPal”)的简单测试,为此我下载了他们的Python服务器,在我的本地主机上进行测试。我在一个Mac上工作,有一个XAMPP服务器(在我的过程中,Apache和MySQL部分打开)。

对于了解Python和sockets等的人来说,我的问题应该非常简单,而且我在信息搜索中发现了很多线索。然而,由于我自己在这方面的知识贫乏,我无法把两个和两个一起修复它。

简短的问题:如何在程序关闭套接字之前将其退出的套接字(从终端)释放出来。Alt-当我想关闭套接字并停止/重新启动服务器时,如何创建一个Python函数供我调用。

情景: 我启动服务器(在终端中使用#:sudo python./PagSeguroServer.py),它运行良好,我做了一些我想做的测试。然后,我需要更改服务器的一些设置,要使其正常工作,我需要重新启动服务器。我通过关闭终端窗口解决了这个问题,但是当我重新打开并键入相同的命令来再次启动服务器时,我得到了“socket.error:[Errno 48]地址已经在使用中”。好的,我知道为什么,但不知道如何修复,所以我用谷歌搜索,然后找到要添加的提示

socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

在密码里。查看了Python类,并试图将其放在我所知的地方(如下所示)。但是,没有解决我的问题。因为我的“搜索和拼图”似乎无法帮助我-我现在放弃它,并张贴这个定制的问题,而不是!

这是服务器代码的一部分:

class SecureHTTPServer(HTTPServer):
    '''Servidor HTTPS com OpenSSL.'''
    def __init__(self, server_address, HandlerClass,fpem):
        BaseServer.__init__(self, server_address, HandlerClass)
        ctx = SSL.Context(SSL.SSLv23_METHOD)
        ctx.use_privatekey_file (fpem)
        ctx.use_certificate_file(fpem)
        self.socket = SSL.Connection(ctx, socket.socket(self.address_family,
                                                        self.socket_type))
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server_bind()
        self.server_activate()

    ....

def run(HandlerClass = HTTPSHandler, ServerClass = SecureHTTPServer):
    '''Roda o servidor'''
    server_address = ('', 443) # (address, port)
    httpd = ServerClass(server_address, HandlerClass, fpem)
    httpd.serve_forever()

if __name__ == '__main__':
    run()

注意:有一次我真的成功地重新打开了它-那是在我添加setsockopt调用之前,我感觉到套接字在超时后关闭了-请在某个地方阅读。不过,这种情况似乎不会再发生了——已经等了好几次了。

编辑:最后这就是我的解决方法:需要终止保存套接字的python进程(请参阅jd的答案注释),然后添加keyboardInterrupt catch以正确关闭套接字。谢谢大家!


Tags: self服务器终端sslsoserveraddresssocket
3条回答

您可以创建一个正确关闭套接字的函数,并使用atexit.register()将其注册为在程序终止时运行。见http://docs.python.org/library/atexit.html

如果使用Ctrl+C关闭进程,可以尝试在代码中捕获键盘中断异常(或者更好地处理SIGINT信号),并在退出之前干净地关闭套接字。

当然,这并不能阻止您以其他方式终止应用程序并使用过时的套接字,但是您也可以尝试处理这些情况。

所以你的工作方式有点不同。

但是你应该从什么开始-当你杀死你的工作服务器类型

netstat-tapdn<grep端口

并用yoiur应用程序的端口替换端口

然后你就会得到关于套接字状态的信息。。。。

相关问题 更多 >