Python TCP 几个同时监听多个端口

标签 python multithreading sockets tcp

我正在构建一个 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()

最佳答案

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

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

然后,您应该选择所有这些,当其中任何一个准备好被接受时,它会返回。

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

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

关于Python TCP 几个同时监听多个端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468160/

相关文章:

c++ - boost ASIO 和线程之间的消息传递

python - Tornado 相当于 Twisted 的 dataReceived 吗?

python - python中的BPF嗅探多个TCP端口的数据包

c++ - 在udp套接字上 boost asio多个async_send

Python Win32 - 与 DriveInfo.IsReady 等效的函数

python - 条件和 itertools.groupby 问题

python - 合并不同范围的直方图

python - 为什么显示 TypeError : 'cluster' object is not callable even when callable(cluster) gives true

java - 如果我从 synchronized block 返回,什么时候释放锁?

java - 为什么我们创建新线程并使用 join() 让父线程等待?