python socket實現工作站監控系統

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實現數據的讀取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章