Python TCP同一时间在多个端口监听

3 投票
1 回答
9350 浏览
提问于 2025-04-17 22:44

我正在搭建一个Python服务器,这个服务器会有很多端口在等待连接。当有连接进来时,那个端口会发送一条消息,然后关闭连接,接着重新准备好等待下一个连接。

我想要实现的功能是:

为每个端口创建一个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()

1 个回答

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

撰写回答