import jsonimport threadingimport timefrom PySide6 import QtCorefrom PySide6.QtCore import Signal, QByteArrayfrom PySide6.QtNetwork import QHostAddressfrom loguru import loggerfrom commonLib.udpComm.udpComm import UdpComm # 你提供的类class TestSqlite(QtCore.QObject):dataReceived = Signal(QByteArray, QHostAddress, int) # data, sender IP, portdef __init__(self, parent=None):super().__init__(parent)self.udp = UdpComm(self)self.udp.dataReceived.connect(self.dataReceived)self.bindUdp()def bindUdp(self) -> None:# 绑定任意地址任意端口(0表示系统自动分配)port = 55666address = "0.0.0.0"self.udp.bind(port, address)logger.info(f"TestSqlite UDP bind to {address}:{port}")def sendTestMessage(self, ip: str, port: int, message: str):data = message.encode("utf-8")self.udp.send_data(data, ip, port)logger.info(f"Sent test message to {ip}:{port}: {message}")class TestControllerSqlite(QtCore.QObject):_uuidCounter = 1_uuidLock = threading.Lock()def __init__(self, remoteIp: str, remotePort: int, parent=None):super().__init__(parent)self.testSqlite = TestSqlite(self)self.testSqlite.dataReceived.connect(self.onDataReceived)self.remoteIp = remoteIpself.remotePort = remotePortself.requestMap = {} # uuid: (sendTime, sql)self.sendCount = 0# 响应时间分段统计self.statsBuckets = {"<10": 0,"10~20": 0,"20~30": 0,"30~40": 0,"40~50": 0,"50~80": 0,"80~100": 0,">100": 0,}@QtCore.Slot(QtCore.QByteArray, QHostAddress, int)def onDataReceived(self, data, senderIp, senderPort):msg = data.data().decode("utf-8", errors="ignore") # 解码字节为字符串# logger.info(f"Received UDP message from {senderIp.toString()}:{senderPort} -> {msg}")try:respJson = json.loads(msg)uuid = str(respJson.get("uuid", ""))if uuid in self.requestMap:sendTime, sqlCmd = self.requestMap[uuid]now = time.time()delayMs = (now - sendTime) * 1000logger.info(f"响应时间统计: uuid={uuid}, delay={delayMs:.2f} ms, sql={sqlCmd}")# 分类统计if delayMs < 10:self.statsBuckets["<10"] += 1elif delayMs < 20:self.statsBuckets["10~20"] += 1elif delayMs < 30:self.statsBuckets["20~30"] += 1elif delayMs < 40:self.statsBuckets["30~40"] += 1elif delayMs < 50:self.statsBuckets["40~50"] += 1elif delayMs < 80:self.statsBuckets["50~80"] += 1elif delayMs < 100:self.statsBuckets["80~100"] += 1else:self.statsBuckets[">100"] += 1# 打印 >= 30ms 的日志和统计if delayMs >= 30:self.logger.infoStats(uuid, delayMs, sqlCmd)else:logger.warning(f"收到未知uuid响应: {uuid}")except Exception as e:logger.error(f"解析响应失败: {e}")# 这里示例回复数据给发送者# reply_msg = f"ACK: received {len(data)} bytes"# self.testSqlite.sendTestMessage(senderIp.toString(), senderPort, reply_msg)# logger.info(f"Sent reply to {senderIp.toString()}:{senderPort}")def printStats(self, uuid: str, delayMs: float, sqlCmd: str):total = self.sendCountstatLines = []for k in self.statsBuckets:count = self.statsBuckets[k]percent = (count / total) * 100 if total > 0 else 0statLines.append(f"{k}: {count} ({percent:.2f}%)")logger.warning(f"响应时间 ≥30ms:uuid={uuid}, delay={delayMs:.2f}ms 当前统计分布:{statLines} total: {total}, sql={sqlCmd} ")@classmethoddef buildSqlQueryJson(cls, sqlCmd: str) -> tuple[str, str]:"""构建 SQL 查询请求的 JSON 字符串:param sqlCmd: 要执行的 SQL 命令(字符串):return: JSON 字符串"""with cls._uuidLock:uuid = cls._uuidCountercls._uuidCounter += 1data = {"source": "cfgManage", "type": "query", "uuid": str(uuid), "dbName": "drtdRecord", "sqlCmd": sqlCmd, "sqlCmdList": ""}# return str(uuid), json.dumps(data, ensure_ascii=False, indent=2)return str(uuid), json.dumps(data, ensure_ascii=False, separators=(",", ":"))def startTestSendThread(self, gapMs: int) -> None:def sendSqlReq():sql_list = ["SELECT * FROM callRecord WHERE dataReadyStat != dataUploadStat LIMIT 20;","SELECT * FROM checkRecord WHERE dataReadyStat != dataUploadStat LIMIT 20;","SELECT * FROM loginRecord WHERE dataReadyStat != dataUploadStat LIMIT 20;","SELECT * FROM logoutRecord WHERE dataReadyStat != dataUploadStat LIMIT 20;","SELECT * FROM orderMsgAckRecord WHERE dataReadyStat != dataUploadStat LIMIT 20;","SELECT * FROM orderMsgRecord WHERE dataReadyStat != dataUploadStat LIMIT 20;",]while True:# 每轮发送前5条 SQL(如需轮换/打乱也可扩展)for sql in sql_list[:5]:uuid, jsonSql = self.buildSqlQueryJson(sql)# logger.info(f"发送 SQL 请求: {sql}")self.requestMap[uuid] = (time.time(), sql)self.testSqlite.sendTestMessage(self.remoteIp, self.remotePort, jsonSql)self.sendCount += 1time.sleep(0.005) # 每条间隔 5ms,避免粘包或过快# 每轮等待 gapMs 毫秒(默认 5000ms)time.sleep(gapMs / 1000)t = threading.Thread(target=sendSqlReq, daemon=True)t.start()def getSqlite(self) -> TestSqlite:return self.testSqlite_controllerSql = Nonedef testControllerSql():global _controllerSqlif _controllerSql is None:_controllerSql = TestControllerSqlite("192.168.21.15", 49080)_controllerSql.startTestSendThread(3000)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。