Python TCP可以同时监听多个端口

Lex*_*con 3 python sockets multithreading tcp

我正在构建一个基本上有一堆端口监听连接的python服务器.进行连接时,端口会发出消息,关闭连接并重置(即等待下一次连接).

期望的功能:

为portlist中的每个端口创建TCP套接字(这是通过参数动态填充的)

听取连接

建立连接时,发送消息并断开连接

继续听

我有一种感觉,我的答案可能在多线程中,但我不确定...到目前为止我的代码:

  for port in portlist:
    ds = ("0.0.0.0", port)

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(ds)
    server.listen(1)
    while 1:
            connection, address = server.accept()
            message="message\n"
            connection.send(message)
            connection.close()
Run Code Online (Sandbox Code Playgroud)

Jon*_*art 9

有单线程方法(无论如何在监听端 - 实际处理连接可能仍然需要多个线程).

您应该预先打开所有套接字,并将它们放在列表中.

然后,你应该select在所有这些中,当它们中的任何一个准备好被accept编辑时它将返回.

像这样的东西(完全未经测试):

servers = [] 

for port in portlist:
    ds = ("0.0.0.0", port)

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(ds)
    server.listen(1)

    servers.append(server)

while True:
    # Wait for any of the listening servers to get a client
    # connection attempt
    readable,_,_ = select.select(servers, [], [])
    ready_server = readable[0]

    connection, address = ready_server.accept()

    # Might want to spawn thread here to handle connection,
    # if it is long-lived
Run Code Online (Sandbox Code Playgroud)