gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:32:38 25 4
gpt4 key购买 nike

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

对于了解Python和socket等的人来说,我的问题应该很简单,而且我在资料搜索中确实发现了很多线索。然而,由于我自己在这方面知识匮乏,我无法将两个和两个放在一起来修复它。

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

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

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以便能够正确关闭套接字。谢谢大家!

最佳答案

如果您使用 Ctrl+C 关闭进程,您可以尝试在代码中捕获 KeyboardInterrupt 异常(或者更好的是处理 SIGINT 信号),并在退出之前彻底关闭套接字。

当然,这不会阻止您以其他方式终止应用程序并拥有陈旧的套接字,但您也可以尝试处理这些情况。

关于python - 在 Python 中关闭/重新启动套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5030274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com