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实现数据的读取。

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