如何让TCP连接等待,直到上一个连接关闭,然后再开始新的连接

How to have a TCP connection await until previous connection is closed before starting a new one

提问人:user8901723980173 提问时间:11/22/2022 最后编辑:Mark Tolonenuser8901723980173 更新时间:11/23/2022 访问量:125

问:

我正在使用 Python、套接字、选择器

我有一个列表,例如 [1,2,3,4,5]

我想打开一个连接,从列表中发送一个项目,关闭连接,然后对列表中的下一个项目重复。

打开连接的方法:

def start_connections(connid, current_message):

    server_addr = (host, port)

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setblocking(False)
    sock.connect_ex(server_addr)

    events = selectors.EVENT_READ | selectors.EVENT_WRITE

    data = types.SimpleNamespace(
        connid=connid,
        recv_total=0,
        messages=current_message,
        outb=b"",
    )
    sel.register(sock, events, data=data)

这是用于确定要启动的连接量的方法:

def number_of_connections(num_conns):
    for i in range(0, num_conns):
        connid = i + 1

        current_message = messages[i]
        start_connections(connid, current_message)

        events = sel.select(timeout=1)
        if events:
            for key, mask in events:
                service_connection(key, mask)

我相信这是我需要实现某种类型的异步/await功能的方法,但我不确定这是否是正确的方法

作为参考,这是读取和写入服务器的方法,目的是在服务器写回客户端时关闭连接

def service_connection(key, mask):
    sock = key.fileobj
    data = key.data

    while True:
        if mask & selectors.EVENT_READ:
            recv_data = sock.recv(1024)  # Should be ready to read
            if recv_data:
               
                data.recv_total += len(recv_data)

            if not recv_data or data.recv_total == 24:
                sel.unregister(sock)
                sock.close()
                break

        if mask & selectors.EVENT_WRITE:
            if not data.outb and data.messages:
                data.outb = data.messages

            if data.outb:
                
                sent = sock.send(data.outb)
                data.outb = data.outb[sent:]

总而言之,我想打开x个连接,当服务器在该连接上写回客户端时,每个连接都会关闭。我一直遇到的主要问题是程序将立即启动所有连接,做一些工作,然后关闭所有连接。在尝试解决这个问题之后,我目前遇到的问题是有方法等待直到方法完成。number_of_connectionservice_connection

python 套接字异 async-await tcp

评论

0赞 user253751 11/22/2022
您需要使程序关闭一个连接时,它会打开另一个连接。
0赞 user253751 11/22/2022
顺便说一句,你的功能不起作用。它只是永远循环,并不断尝试读/写,即使没有任何东西可以读/写,因为掩码没有更新service_connection
0赞 user8901723980173 11/23/2022
如何使新连接在关闭后打开?来自 javascript,您可以执行 async/await,但我不确定这是否是正确的方法,或者是否可以在 python 中执行此操作
0赞 user253751 11/23/2022
Python 只是按顺序运行命令。你知道你关闭连接的部分吗?是的,在下一行,输入命令以打开一个新命令。然后计算机将在关闭旧计算机后打开一个新计算机。
0赞 user253751 11/23/2022
但是您的整个程序存在问题,我不确定您是否真的知道如何使用这些选择器和键。所以不要!您需要使用选择器和键以及 setblocking(False) 是否有原因?

答: 暂无答案