python TCP 服务端实时监控所有客户端是否连接的程序
时间: 2023-06-05 07:08:38 浏览: 293
python的socket编程.zip
5星 · 资源好评率100%
可以使用 select 模块实现。首先创建一个 socket 实例用于监听客户端的连接,然后使用 select 监听该 socket 的读事件和所有已连接客户端 socket 的读事件。当接收到一个新连接时,加入到监听列表中,当其中一个连接关闭时,将其从监听列表中移除即可实时监控所有客户端的连接状态。具体实现可以参考以下代码:
```
import select
import socket
SERVER_HOST = 'localhost'
SERVER_PORT = 5000
BACKLOG = 5
# 创建监听socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(BACKLOG)
# 初始化监听列表,添加监听socket
sockets_list = [server_socket]
print(f'Server started on {SERVER_HOST}:{SERVER_PORT}')
while True:
# 使用select监听sockets_list中的socket
read_sockets, _, exception_sockets = select.select(sockets_list, [], sockets_list)
# 处理每个可读的socket
for sock in read_sockets:
# 如果是监听socket接收到了一个新连接
if sock == server_socket:
client_sock, client_addr = server_socket.accept()
sockets_list.append(client_sock)
print(f'Client connected from {client_addr[0]}:{client_addr[1]}')
# 如果是已连接的客户端socket,接收并处理数据
else:
try:
data = sock.recv(1024)
# 如果返回空数据表示连接已关闭,移除socket并关闭连接
if not data:
print(f'Client disconnected from {sock.getpeername()[0]}:{sock.getpeername()[1]}')
sockets_list.remove(sock)
sock.close()
else:
print(f'Received data from {sock.getpeername()[0]}:{sock.getpeername()[1]}: {data.decode().strip()}')
except:
# 发生异常表示连接异常,移除socket并关闭连接
print(f'Client disconnected from {sock.getpeername()[0]}:{sock.getpeername()[1]}')
sockets_list.remove(sock)
sock.close()
# 处理异常socket,移除socket并关闭连接
for sock in exception_sockets:
print(f'Exception occured on {sock.getpeername()[0]}:{sock.getpeername()[1]}')
sockets_list.remove(sock)
sock.close()
```
需要注意的是,这只是一个简单的示例,实际使用时可以根据具体需求进行调整和改进。
阅读全文