Python_django+server+客户端构建监控平台

需求

公司产品是ap设备,包含ap设备的对接即接口,ap设备的性能测试等等,所以每个ap设备的测试都是独立的,想要实现各个型号的ap设备测试汇总情况,所以有了这个系统。

结构图

image.png

实现原理

对应上图中序号:

  1. 设备端通过运行客户端执行脚本,计算脚本结果、指标,通过tcp socket将结果上报给服务端。服务端接收到请求后,返回响应结果,即完成一次数据上报;

2.服务端将接收到的数据相应业务逻辑,进行入库操作。

3.web服务器分类展示表中数据

主要说下服务端:

1.基础服务实现
BaseServer.py


import SocketServer,socket
from control import *
svsocket = getconfig()['svsocket']
class ThreadedUDPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    daemon_threads = True
    log.debug('server start.')

class BaseServer(SocketServer.BaseRequestHandler):

    ip = ""
    port = 0
    timeOut = svsocket['TIMEOUT']     # 设置超时时间变量

    client_addr = []
    client_socket = []

    def setup(self):
        try:
            self.ip = self.client_address[0].strip()     # 获取客户端的ip
            self.port = self.client_address[1]           # 获取客户端的port
            self.request.settimeout(self.timeOut)        # 对socket设置超时时间
            log.debug('join_client:{}:{}'.format(self.ip,self.port))
            self.client_addr.append(self.client_address) # 保存到队列中
            self.client_socket.append(self.request)      # 保存套接字socket
            log.debug('all_clint:{}'.format(self.client_addr))
        except BaseException as e:
            log.error(e)

    def finish(self):
        """
        这个方法会执行2次,第二次执行的时候必然报错 ,故pass
        :return:
        """
        try:
            self.client_addr.remove(self.client_address)
            self.client_socket.remove(self.request)
            log.debug('disconnect_client:{}:{}'.format(self.ip,self.port))
        except:
            pass

    def handle(self):
        # 主要的处理业务函数
        while True:
            try:
                try:
                    self.recvdata_ori = self.request.recv(2048)
                except socket.timeout:  # 如果接收超时会抛出socket.timeout异常
                    log.warning('port:{}-timeout_client:{}:{}'.format(self.port, self.ip, self.port))
                    break       # 记得跳出while循环
                if self.recvdata_ori:    # 判断是否接收到数据
                    recv = json.loads(self.recvdata_ori)
                    log.debug('recv:{}'.format(recv))
                    if recv.has_key('who'):
                        if 'sts'==recv['who']:
                            resp = insert_sts(recv)
                        elif 'ap_kaoji' == recv['who']:
                            resp = insert_ap(recv)
                        elif 'ap_test' == recv['who']:
                            resp = insert_ap_test(recv)
                else:
                    self.finish()
            except BaseException as e:
                log.error(e)
                raise e

    def send(self,data):
        try:
            result = self.request.send(data)
            log.debug('send_result:{}'.format(result))
        except BaseException as e:
            log.error(e)

2.应用多线程启动服务

from BaseServer import BaseServer
import SocketServer
addr = (host,port)
log.debug(addr)
# 解决地址被占用问题,这个很重要,不然重启服务的时候总是提示地址被占用了
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.ThreadingTCPServer(addr, BaseServer)
server.serve_forever()

这样服务就搞定了,至于多线程的控制,socketServer自己实现的,咱们就不用关心了。

@2018-04-03 09:00:51-阴天

你可能感兴趣的:(Python_django+server+客户端构建监控平台)