# UPAServer **Repository Path**: littlewing/UPAServer ## Basic Information - **Project Name**: UPAServer - **Description**: 手机客户端性能收集服务器 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-05-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 UPAServer是基于python3开发的简易服务器程序,开启server后绑定端口并持续监听游戏(UE4引擎)客户端发送的性能数据,将性能数据反序列化并解析后写入influxdb供Grafana展示。 # 安装 **依赖库 / 依赖工具** - protobuf 3.7.1 - google 提供的开源库,供 python 程序调用 proto buffer 格式的相关方法,如序列化、反序列化等。 - protoc 3.7.1 - google 提供的开源工具,可以将 proto 文件解析成 py 文件,并将 proto 文件中的数据类型转换为 python 能够识别的数据类型。WindowsOS 使用的是 protoc.exe 文件,LinuxOS 使用的是 protoc 文件。 ```shell python3 ./lib/setup.py ``` 运行 setup.py 文件即可在离线环境下安装需要的依赖库,并根据 proto 文件生成对应的 _pb2.py 文件。 # 修改配置 ```python class Settings: _root = os.path.abspath(os.path.dirname(__file__)) # 服务器监听端口 SERVER_LISTENING_PORT = 20000 # 客户端连接超时时间 CLIENT_SETUP_TIMEOUT = 300 # 客户端最大数目 CLIENT_MAX_NUM = 50 # 数据存储方式 SAVER_LIST = [ "ConsoleSaver", # "CSVSaver", # "InfluxSaver", ] # CSV文件目录 CSV_DIR = os.path.join(_root, "CSV") # InfluxDB 连接配置 INFLUXDB_HOST = "localhost" INFLUXDB_PORT = 8086 INFLUXDB_USER = "" INFLUXDB_PASS = "" INFLUXDB_DATABASE = "test" INFLUXDB_MEASUREMENT = "performanceStats" if "CSVSaver" in SAVER_LIST: if not os.path.exists(CSV_DIR): os.mkdir(CSV_DIR) ``` 这是 server 的配置,请注意: - 由于使用了 python3 标准库中的 TCPServer 并使用了 threading 模块为多客户端连接开启多线程,所以本身性能十分有限,所以 CLIENT_MAX_NUM 不要设置得太高,默认为50。 - 数据存储方式目前定义了3种:控制台输出、存储为CSV文件,写入influxdb。由于该 server 的项目定制度较高,所以写入方式写的比较死,如有特殊需求,自行调整即可。 # 运行 ```shell python3 ./server.py 即可 ``` # 目录结构 - lib - 由于考虑到内网环境,所以将 server 需要的依赖包和依赖工具存放到 lib 中,运行 setup.py 即可安装依赖库并生成 _pb2.py文件。 - exceptions.py - 自定义异常类 - pbdata.py - 由于通信时使用了 google proto buffer 交换格式,所以在这里定义了对 gpb 的反序列化,并将其解析成统计表头和统计值。 - saver.py - 定义了基类 Saver 用于存储统计数据,子类需要实现析构函数, save_header 和 save_stats 接口。 ```python def __del__(self): """ 析构函数,用于销毁saver对象,关闭数据库连接等 :return: """ raise SaverHandleError("Undefined __del__ method") def save_header(self, header): """写入header列表""" raise SaverHandleError("Undefined saver header method") def save_stats(self, stats): """写入stats嵌套列表""" raise SaverHandleError("Undefined saver stats method") ``` - settings.py - 定义了 server 相关的设置 - server.py - 使用了 python3 提供的 socketserver.TCPServer 和 socketserver.BaseRequestHandler, 并重写了 BaseRequestHandler 的 handle(),setup(),finish() 方法。