gpt4 book ai didi

python - 关闭后直接在代码中再次启动带有 ThreadingMixIn 的 TCPServer。 (给出 `Address already in use` )

转载 作者:太空狗 更新时间:2023-10-30 00:41:52 26 4
gpt4 key购买 nike

我尝试使用 Python 中的线程 (ThreadingMixIn) 编写 TCPServer。问题是我无法正确关闭它,因为当我再次尝试运行时出现 socket.error: [Errno 48] Address already in use 。这是触发问题的 python 代码的最小示例:

import socket
import threading
import SocketServer

class FakeNetio230aHandler(SocketServer.BaseRequestHandler):

def send(self,message):
self.request.send(message+N_LINE_ENDING)

def handle(self):
self.request.send("Hello\n")

class FakeNetio230a(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def __init__(self, server_address, RequestHandlerClass):
self.allow_reuse_address = True
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)

if __name__ == '__main__':
for i in range(2):
fake_server = FakeNetio230a(("", 1234), FakeNetio230aHandler)
server_thread = threading.Thread(target=fake_server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
# might add some client connection here
fake_server.shutdown()

所有主要代码应该做的就是启动服务器,关闭它并再次运行它。但是会触发上述错误,因为第一次关机后套接字还没有释放。

我以为设置self.allow_reuse_address = True可以解决问题,但是没有用。当 python 程序完成时,我可以立即再次运行它,它可以启动服务器一次(但不是两次)。
但是,当我随机化端口(例如将 1234 替换为 1234+i )时,问题就消失了,因为没有其他服务器正在监听该地址。

有一个类似的SO Q Shutting down gracefully from ThreadingTCPServer但解决方案(将 allow_reuse_address 设置为 True 不适用于我的代码,我不使用 ThreadingTCPServer)。

我必须如何修改我的代码才能在我的代码中启动服务器两次?

更多信息:我这样做的原因是我想为我的 python 项目运行一些单元测试。这需要提供我的软件应该连接到的(假)服务器。

编辑:
我刚刚找到了我的问题的最正确答案:我必须在我的主要执行代码的末尾添加 fake_server.server_close()(紧接在 fake_server.shutdown() 之后) ).我在 TCPServer 实现的源文件中找到了它。它所做的只是 self.socket.close()

最佳答案

不知何故,当您分配给它时,fake_server 不会解除绑定(bind)(在 for 语句的第一行)。

要解决这个问题,只需在循环结束时删除 fake_server:

        del fake_server # force server to unbind

关于python - 关闭后直接在代码中再次启动带有 ThreadingMixIn 的 TCPServer。 (给出 `Address already in use` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5218159/

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