python 创建一个多客户端连接的tcp服务器,其中在没有客户端连接时,这个程序能执行其他的操作,客户端断开时,也能保持正常状态
时间: 2024-05-16 21:16:57 浏览: 61
可以使用 `select` 模块来实现多客户端连接的 TCP 服务器,同时也可以在没有客户端连接时执行其他操作,并在客户端断开时保持正常状态。以下是一个简单的示例代码:
```python
import socket
import select
# 创建 TCP 服务器套接字并绑定到本地主机的端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 9999))
server_socket.listen(5)
# 创建一个列表来存储所有客户端套接字
clients = [server_socket]
# 创建一个字典来存储每个客户端的缓冲区数据
buffers = {}
while True:
# 使用 select 等待套接字的可读事件,超时时间为 1 秒
readable, writable, exceptional = select.select(clients, [], [], 1)
# 处理可读事件
for sock in readable:
# 如果是服务器套接字,则表示有新的客户端连接
if sock == server_socket:
client_socket, client_address = server_socket.accept()
print(f'New connection from {client_address}')
clients.append(client_socket)
buffers[client_socket] = b''
# 否则表示有客户端发送数据
else:
data = sock.recv(1024)
# 如果客户端发送空数据,则表示客户端已经关闭连接
if not data:
print(f'Connection closed by {sock.getpeername()}')
clients.remove(sock)
del buffers[sock]
sock.close()
else:
# 将接收到的数据添加到客户端缓冲区
buffers[sock] += data
# 处理客户端缓冲区数据
for sock, buffer in buffers.items():
if buffer:
print(f'Received {len(buffer)} bytes from {sock.getpeername()}')
# 在这里处理客户端发送的数据,例如解析命令、发送响应等
# 处理完数据后,清空客户端缓冲区
buffers[sock] = b''
# 在没有客户端连接时执行其他操作,例如定时任务等
if len(clients) == 1:
print('No active connections, performing other tasks...')
```
该示例代码创建了一个 TCP 服务器套接字并绑定到本地主机的端口,使用 `select` 等待套接字的可读事件,处理客户端连接和断开事件,以及处理客户端发送的数据。当没有客户端连接时,可以执行其他操作。注意,该示例代码仅用于演示,实际应用中需要根据具体需求进行修改和优化。
阅读全文