本程序為一個基於TCP協定的服務端程序,可以接收客戶端發送的指令並執行對應的操作,最終將操作結果傳回給客戶端。程式運行在localhost(即本機)的8888埠。
主要功能與指令:
• 取得CPU使用率:指令「cpu」
• 取得記憶體使用率:指令「memory」
• 取得網路頻寬資訊:指令「network」
• 取得目前登入使用者:指令「user」
• 取得系統負載狀況:指令「loadavg」
• 取得目前時間:指令「time」
• 取得進程清單:指令「process」
• 取得系統資訊:指令「system」
• 取得網路連線清單:指令「connection」
• 取得GPU使用情況:指令「gpu」
• 取得磁碟使用情況:指令「disk」
對於不同的指令,程式採用不同的函式庫函數進行資料取得與處理,具體如下:
• 對於指令“cpu”,使用psutil函式庫取得CPU使用率。
• 對於指令“memory”,使用psutil函式庫取得記憶體使用率。
• 對於指令“network”,使用speedtest-cli庫取得網路頻寬資訊。
• 對於指令“user”,使用psutil庫取得目前登入使用者。
• 對於指令“loadavg”,使用os庫取得系統負載狀況。
• 對於指令“time”,使用datetime庫取得目前時間。
• 對於指令“process”,使用psutil庫取得進程清單。程式將進程依照記憶體使用量排序,只回傳前10個進程。
• 對於指令“system”,使用platform庫取得系統資訊。
• 對於指令“connection”,使用psutil庫取得網路連線清單。程式將連線依照進程ID排序,只回傳前10個連線。
• 對於指令“gpu”,使用nvidia-smi工具取得GPU使用情況。
• 對於指令“disk”,使用psutil函式庫取得磁碟使用量。
每個指令的處理結果均以字串形式傳回給客戶端。在處理指令時,程式會判斷接收到的資料是否為空。如果為空,則斷開連線並關閉客戶端套接字。程式中的handle_client函數是負責與單一客戶端通訊的執行緒函數,每個客戶端連線都會啟動一個執行緒。
該程式是一個簡單的TCP客戶端,可以連接到一個伺服器並向其發送請求,然後等待伺服器的回應。程式使用Python的socket模組來建立TCP套接字,並使用connect方法連接到一個伺服器位址。程式透過循環不斷地等待使用者輸入請求資料類型,然後將請求資料類型編碼成UTF-8格式並使用sendall方法將其傳送給伺服器。接著程式等待伺服器回應,並將回應資料解碼成UTF-8格式並列印出來。最後,程式關閉客戶端套接字。
程式的主要流程如下:
1. 導入socket模組。
2. 建立一個TCP套接字物件。
3. 連接到指定的伺服器位址。
4. 循環等待使用者輸入請求資料類型。
5. 將請求資料類型編碼成UTF-8格式並傳送給伺服器。
6. 等待伺服器回應並接收回應資料。
7. 將回應資料解碼成UTF-8格式並列印出來。
8. 關閉客戶端套接字。
該程式可以用於與提供特定資料類型的伺服器進行通訊。使用者可以輸入不同的請求資料類型來取得不同類型的資料。伺服器將根據請求類型傳回相應的資料。程式的運作依賴於伺服器的可用性和回應速度。如果伺服器無法回應,程式將等待,直到伺服器回應或程式中斷。
服務端
import os import socket import subprocess import threading from datetime import datetime from sys import platform import psutil from speedtest import Speedtest # 创建TCP套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP和端口 server_address = ('localhost', 8888) server_socket.bind(server_address) # 监听连接请求 server_socket.listen(5) def handle_client(client_socket, client_address): while True: # 接收客户端发送的数据 data = client_socket.recv(1024) # 如果接收到空数据,则断开连接 if not data: client_socket.close() print(f"Connection with {client_address} closed") break # 处理接收到的数据 request = data.decode('utf-8') if request == 'cpu': # 使用psutil库获取CPU使用率 cpu_percent = psutil.cpu_percent(interval=1) response_data = f'CPU使用率:{cpu_percent}%'.encode('utf-8') elif request == 'memory': # 使用psutil库获取内存使用率 memory_percent = psutil.virtual_memory().percent response_data = f'内存使用率:{memory_percent}%'.encode('utf-8') elif request == 'network': # 使用speedtest-cli库获取网络带宽信息 st = Speedtest() download_speed = st.download() upload_speed = st.upload() response_data = f'下载速度:{download_speed / 1000000}Mbps,上传速度:{upload_speed / 1000000}Mbps'.encode('utf-8') elif request == 'user': # 使用psutil库获取当前登录用户 username = psutil.users()[0].name response_data = f'当前登录用户:{username}'.encode('utf-8') elif request == 'loadavg': # 使用os库获取系统负载情况 load_avg = os.getloadavg() response_data = f'系统负载情况:{load_avg}'.encode('utf-8') elif request == 'time': # 使用datetime库获取当前时间 current_time = datetime.datetime.now() response_data = f'当前时间:{current_time}'.encode('utf-8') elif request == 'process': # 使用psutil库获取进程列表 process_list = [] for process in psutil.process_iter(['pid', 'name', 'memory_info']): try: process_list.append((process.info['pid'], process.info['name'], process.info['memory_info'].rss)) except (psutil.AccessDenied, psutil.NoSuchProcess): pass process_list.sort(key=lambda x: x[2], reverse=True) response_data = '' for i, (pid, name, memory) in enumerate(process_list[:10]): response_data += f'{i + 1}. 进程名称:{name},进程ID:{pid},占用内存:{memory / 1024 / 1024:.2f}MB\n' response_data = response_data.encode('utf-8') elif request == 'system': # 使用platform库获取系统信息 system_info = f'操作系统:{platform.system()} {platform.release()}\n处理器:{platform.processor()}\nPython版本:{platform.python_version()}' response_data = system_info.encode('utf-8') elif request == 'connection': # 使用psutil库获取网络连接列表 conn_list = [] for conn in psutil.net_connections(): if conn.status == psutil.CONN_ESTABLISHED: conn_list.append((conn.laddr.ip, conn.laddr.port, conn.raddr.ip, conn.raddr.port, conn.pid)) conn_list.sort(key=lambda x: x[4]) response_data = '' for i, (laddr_ip, laddr_port, raddr_ip, raddr_port, pid) in enumerate(conn_list[:10]): response_data += f'{i + 1}. 本地地址:{laddr_ip}:{laddr_port},远程地址:{raddr_ip}:{raddr_port},进程ID:{pid}\n' response_data = response_data.encode('utf-8') elif request == 'disk': # 使用psutil库获取磁盘使用情况 disk_usage = psutil.disk_usage('/') disk_info = f'磁盘总容量:{disk_usage.total / 1024 / 1024 / 1024:.2f}GB,已用容量:{disk_usage.used / 1024 / 1024 / 1024:.2f}GB,可用容量:{disk_usage.free / 1024 / 1024 / 1024:.2f}GB' response_data = disk_info.encode('utf-8') elif request == 'load': # 使用psutil库获取系统负载 load_avg = psutil.getloadavg() load_info = f'1分钟内平均负载:{load_avg[0]:.2f},5分钟内平均负载:{load_avg[1]:.2f},15分钟内平均负载:{load_avg[2]:.2f}' response_data = load_info.encode('utf-8') elif request == 'thread': # 使用psutil库获取进程线程数 thread_info = f'当前进程线程数:{psutil.Process().num_threads()}' response_data = thread_info.encode('utf-8') else: response_data = b'Invalid request' # 发送响应数据 client_socket.sendall(response_data) # 接收多个客户端连接 while True: client_socket, client_address = server_socket.accept() print(f"New connection from {client_address}") # 创建新线程处理客户端连接 client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) client_thread.start()
客戶端
import socket # 创建TCP套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 server_address = ('localhost', 8888) client_socket.connect(server_address) while True: # 发送请求数据给服务器 request = input("请输入要请求的数据类型(cpu/memory/network/user/loadavg/time/process/system/connection/disk/load/thread):") client_socket.sendall(request.encode('utf-8')) # 接收服务器响应数据 response_data = client_socket.recv(1024) # 处理接收到的数据 response = response_data.decode('utf-8') print(response) # 关闭客户端套接字 client_socket.close()
以上是Python怎麼實現監控遠端主機即時數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!