美文网首页测试开发
Python_django+server+客户端构建监控平台

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

作者: 古佛青灯度流年 | 来源:发表于2018-04-03 09:00 被阅读18次

    需求

    公司产品是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+客户端构建监控平台

      本文链接:https://www.haomeiwen.com/subject/bwtqhftx.html