使用Python实现多个客户端的tcp监听,并与选择的客户端进行回复
时间: 2024-06-11 11:08:18 浏览: 83
下面是一个示例代码,实现了多个客户端的tcp监听,并能够与选择的客户端进行回复:
```python
import socket
import select
# 创建一个TCP socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口号
server_socket.bind(('localhost', 8888))
# 开始监听
server_socket.listen(5)
# 客户端列表
client_sockets = []
while True:
# 使用select函数,等待有可读的socket
read_sockets, _, _ = select.select([server_socket] + client_sockets, [], [])
for sock in read_sockets:
# 如果是新连接,将其加入客户端列表
if sock == server_socket:
client_socket, client_address = server_socket.accept()
print(f"New connection from {client_address}")
client_sockets.append(client_socket)
# 如果是已连接的socket,接收数据并回复
else:
data = sock.recv(1024)
if not data:
# 如果数据为空,说明客户端已经关闭连接,将其从列表中删除
print(f"Connection closed from {sock.getpeername()}")
client_sockets.remove(sock)
else:
print(f"Received data from {sock.getpeername()}: {data.decode('utf-8')}")
# 选择一个客户端进行回复
reply_socket = client_sockets[0] if len(client_sockets) > 1 and sock == client_sockets[0] else client_sockets[-1]
reply_socket.sendall(data)
# 关闭连接
server_socket.close()
```
在上面的代码中,使用了select函数来等待有可读的socket,这样可以同时处理多个客户端的连接。当有新连接时,将其加入客户端列表中;当有数据到达时,接收数据并选择一个客户端进行回复。如果客户端关闭了连接,则将其从列表中删除。最后,在循环结束后,关闭连接。
阅读全文