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