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