Python 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()
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