1、需求分析
使用python實現工作站監控系統,總共分成數據採集端(客戶端)和服務器端,其中數據採集端每隔一段時間採集一份數據上傳到服務器中,並且得到服務器的反饋;服務器端則獲取客戶端採集到的數據信息,對其進行處理,然後發送反饋信息。其中客戶端有多個,需要服務器能夠併發處理多個請求的能力。
2、整體架構
- 服務器使用的是阿里雲服務器,用的是公網IP,全網都可以訪問
- 數據採集器,這裏用ubuntu16.04、win7、win10這三種機器做模擬,上傳數據到服務器當中
3、服務器的實現
Step1:申請阿里雲服務器
Step2:在雲服務器的防火牆中設置對外端口
Step3:在雲服務器中開啓對應端口
4、客戶端的實現
5、socket
socket
是屬於傳輸層(TCP/UDP)和應用層(用戶進程)之間的一層。- 讓使用者直接屏蔽掉TCP/IP協議族,去關注數據的傳輸。
- 與requests庫中的HTTP請求稍有不同,但都是實現數據在客戶端與服務器之間的傳輸。
- 在python中直接調用socket庫。
socket
工作流程如下
- 先從服務器端說起。服務器端先初始化Socket,然後與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端連接。在這時如果有個客戶端初始化一個Socket,然後連接服務器(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。客戶端發送數據請求,服務器端接收請求並處理請求,然後把迴應數據發送給客戶端,客戶端讀取數據,最後關閉連接,一次交互結束。
6、程序代碼
# === TCP服務器程序 server.py ===
import socket
import threading
def clientHandler(dataSocket,addr):
while True:
recved = dataSocket.recv(1024)
if not recved:
print('client %s close link'% addr)
break
info = recved.decode()
print('recved info from %s: %s'% (addr,info))
dataSocket.send(('service recive the info %s '% info).encode()) # 發送的數據類型必須是bytes,所以要編碼
dataSocket.close()
def socket_service():
IP = "*.*.*.*" # 服務器的IP地址
PORT = 6666 # 該套接字使用的端口號
BUFLEN = 1024 # 定義一次從socket緩存區中最多讀入512個字節數據
# 實例化一個socket對象,
# 參數AF_INET 表示該socket網絡層使用IP協議
# 參數SOCK_STREAM 表示socket傳輸層使用TCP協議
listenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listenSocket.bind((IP,PORT)) # socket綁定地址和端口
listenSocket.listen(10) # 使socket處於監聽狀態,等待客戶端的連接請求,參數10表示最多接收多少個等待連接的客戶端
print('Waiting connection...')
while True:
dataSocket,addr = listenSocket.accept()
print('Client %s link suceess :'% addr)
th = threading.Thread(target=clientHandler,args=(dataSocket,addr)) # 多線程,可以同時接收多個客戶端的請求
th.start()
listenSocket.close()
if __name__=='__main__':
socket_service()
# === TCP 客戶端程序 client.py ===
import socket
import time,datetime
import psutil
import json
def socket_client():
IP = "*.*.*.*"
SERVER_PORT = 6666
BUFLEN = 1024
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 連接服務器 IP:PORT
s.connect(('*.*.*.*',6666))
while True:
time.sleep(4) # 暫停4秒
data = psutil.virtual_memory() #讀取計算機信息
# 將信息表示成類似json格式
info = [{
"time":datetime.datetime.now().strftime('%Y-%m-%d-%H:%M:%S'),
"save":data.percent,
"cpu":psutil.cpu_percent(interval=1)
}]
jsonstr = json.dumps(info) # 將數據生成json格式
data = jsonstr.encode() # 對數據進行編碼
s.send(data) #傳輸數據到服務器中
print(s.recv(1024)) #打印服務器返回的信息
# 關閉連接
s.close()
if __name__=='__main__':
socket_client()
7、實驗結果與分析
7.1 服務器實驗
這裏有兩臺數據採集終端像服務器發送數據信息,程序已經運行了4個小時,經過測試,較爲平穩
7.2 客戶端實驗
客戶端能夠較好的接受服務器的數據
7.3 實驗分析
優點:
- 能夠實現局域網中的多個數據採集終端把信息傳送到服務器當中,並且能夠接受到服務器的反饋信息,能夠初步完成實驗需要
缺點:
- 數據傳輸到服務器當中,將這些數據存儲爲txt、json、xml等文件並不是很好,需要對文件不停的進行打開、讀寫、關閉,不太合適,需要存儲到mysql數據庫當中,但python直接操作mysql數據庫不是很方便,這裏需要改進
改進:
這裏不採用socket實現通信,可以採用request庫,通過http方式傳輸json數據以及文件數據到服務器當中,在服務器後臺使用django架構的服務實現與後臺的傳輸,通過restframework實現數據的讀取。