当前位置:首页>python>Python实现会议屏幕局域网远程屏幕共享系统

Python实现会议屏幕局域网远程屏幕共享系统

  • 2026-07-02 16:27:59
Python实现会议屏幕局域网远程屏幕共享系统

 基于 BIOS SN 的局域网远程屏幕共享系统

在日常运维、远程协作和设备巡检场景中,快速查看远端电脑屏幕是极为常见的需求。 本系统基于 C/S 架构,以电脑主板 BIOS 序列号(SN)作为设备唯一标识, 实现了一套轻量级的局域网屏幕共享方案。服务端利用 mss 库高效截取屏幕画面, 经 OpenCV 编码为 JPEG 后通过 Flask 提供 MJPEG 视频流接口; 客户端基于 PyQt5 构建图形界面,运维人员只需输入目标设备 SN, 即可实时接收并显示远端电脑的完整桌面画面。整套系统无需安装第三方远程桌面软件, 部署简单、资源占用低、支持 10 台设备同时在线,非常适合中小规模局域网环境下的设备监控与协作。


架构

┌─────────────────────────────────────────────────────────────────────┐│                         局 域 网                                      ││                                                                     ││  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐           ││  │ 被控电脑 A     │  │ 被控电脑 B     │  │ 被控电脑 C     │           ││  │ SN: 5CD514..  │  │ SN: ABC123..  │  │ SN: XYZ987..  │           ││  │ IP: .1.100    │  │ IP: .1.101    │  │ IP: .1.102    │           ││  │               │  │               │  │               │           ││  │ screen_       │  │ screen_       │  │ screen_       │           ││  │ server.py     │  │ server.py     │  │ server.py     │           ││  │ :5001         │  │ :5001         │  │ :5001         │           ││  │               │  │               │  │               │           ││  │ [mss截屏]     │  │ [mss截屏]     │  │ [mss截屏]     │           ││  │    ↓          │  │    ↓          │  │    ↓          │           ││  │ [JPEG编码]    │  │ [JPEG编码]    │  │ [JPEG编码]    │           ││  │    ↓          │  │    ↓          │  │    ↓          │           ││  │ [MJPEG流]     │  │ [MJPEG流]     │  │ [MJPEG流]     │           ││  └───────┬───────┘  └───────┬───────┘  └───────┬───────┘           ││          │                  │                  │                    ││          └──────────────────┼──────────────────┘                    ││                             │  HTTP GET /stream                      ││                             ▼                                       ││                  ┌─────────────────────┐                            ││                  │    控制端电脑         │                            ││                  │    screen_client.py  │                            ││                  │    输入 SN → 看屏幕   │                            ││                  └─────────────────────┘                            │└─────────────────────────────────────────────────────────────────────┘

✨ 功能特性

模块
功能
描述
🖥️ 服务端
SN 自动识别
启动时自动获取本机 BIOS 序列号
🖥️ 服务端
高效截屏
基于 mss 库,截屏速度远超 Pillow
🖥️ 服务端
自适应缩放
截屏后缩放至 1280×720 降低带宽
🖥️ 服务端
帧率控制
约 15fps,平衡流畅度与性能
🖥️ 服务端
RESTful API
提供 SN 查询、状态查询、停止推流接口
📱 客户端
设备管理
可视化表格管理多台设备
📱 客户端
一键连接
输入 SN 自动匹配 IP 并接收屏幕流
📱 客户端
多线程接收
网络 IO 不阻塞 GUI
📱 客户端
配置持久化
JSON 文件保存,重启不丢失

🛠️ 环境要求

服务端(每台被控电脑):

Python >= 3.8opencv-python >= 4.5Flask >= 2.0mss >= 6.0numpy >= 1.20Windows 操作系统

客户端(控制电脑):

Python >= 3.8opencv-python >= 4.5PyQt5 >= 5.15requests >= 2.25numpy >= 1.20

🚀 快速部署

1. 服务端部署(每台被控电脑执行)

pip install flask mss opencv-python numpypython screen_server.py

启动后输出:

[屏幕共享服务端] 本机 SN: 5CD5145Y25[屏幕共享服务端] 监听端口: 5001[屏幕共享服务端] 屏幕流地址: http://<本机IP>:5001/stream

2. 客户端启动(控制电脑执行)

pip install opencv-python PyQt5 requests numpypython screen_client.py

3. 使用流程

┌───────────────────────────────────────────────────────────────┐│  Step 1: 在每台被控电脑上启动 screen_server.py                  ││      ↓                                                        ││  Step 2: 在控制电脑启动 screen_client.py                        ││      ↓                                                        ││  Step 3: 添加设备 (填入对方 SN + IP + 端口) → 点击「添加/更新」   ││      ↓                                                        ││  Step 4: 输入 SN → 点击「连接屏幕」→ 实时查看远程桌面           │└───────────────────────────────────────────────────────────────┘

🧩 核心代码解析

Part 1:服务端 — 高效屏幕截取引擎

本模块使用 mss 库截取屏幕画面,相比 Pillow 的 ImageGrab,mss 基于系统原生 API,速度快 3~5 倍。

import mssimport numpy as npimport cv2import timedefgenerate_frames():"""截取屏幕生成 MJPEG 视频流"""global streaming    streaming = Truewith mss.mss() as sct:        monitor = sct.monitors[1]  # 主显示器(monitors[0] 是所有屏幕的合集)while streaming:# 截取屏幕 — 返回 BGRA 格式的原始像素数据            img = sct.grab(monitor)# mss 输出为 BGRA 4通道,去掉 Alpha 通道得到 BGR            frame = np.array(img)[:, :, :3]# 缩放至 1280x720,使用 INTER_AREA 插值(缩小时效果最佳)            frame = cv2.resize(frame, (1280720), interpolation=cv2.INTER_AREA)# JPEG 编码,质量 55            _, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 55])# 以 MJPEG multipart 格式输出yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')# 控制帧率 ~15fps            time.sleep(0.066)

技术要点:

  • mss.mss() 上下文管理器:自动管理系统资源,截屏效率极高
  • monitors[1]:主显示器;monitors[0] 代表所有显示器的虚拟合集
  • BGRA → BGR:mss 返回 4 通道数据,需丢弃 Alpha 通道供 OpenCV 处理
  • cv2.INTER_AREA:缩小图像时的最佳插值算法,避免锯齿
  • time.sleep(0.066):约 15fps,平衡画面流畅度与 CPU/网络负载
  • JPEG 质量 55:单帧约 40~80KB,1280×720 分辨率下带宽需求约 5~10 Mbps

Part 2:服务端 — Flask HTTP 服务与 API 设计

服务端基于 Flask 暴露 RESTful 接口,支持 SN 查询、视频流获取、状态管理。

import subprocessfrom flask import Flask, Response, jsonifyapp = Flask(__name__)streaming = Falsedefget_bios_sn():"""获取本机 BIOS 序列号"""try:        result = subprocess.run(            ['wmic''bios''get''serialnumber'],            capture_output=True, text=True, timeout=10        )        lines = [l.strip() for l in result.stdout.strip().split('\n'if l.strip()]if len(lines) >= 2:return lines[1]except Exception:passreturn"UNKNOWN"LOCAL_SN = get_bios_sn()@app.route('/sn')defget_sn():"""获取本机 SN"""return jsonify({"sn": LOCAL_SN})@app.route('/stream')defvideo_stream():"""屏幕共享视频流 — MJPEG 格式,浏览器可直接访问"""return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')@app.route('/stop')defstop_stream():"""停止推流,释放资源"""global streaming    streaming = Falsereturn jsonify({"status""stopped"})@app.route('/status')defstatus():"""查询当前服务状态"""return jsonify({"sn": LOCAL_SN, "streaming": streaming})if __name__ == '__main__':    app.run(host='0.0.0.0', port=5001, threaded=True)

技术要点:

  • host='0.0.0.0':监听所有网卡接口,局域网设备可通过 IP 访问
  • threaded=True:多线程处理并发请求,支持同时被多个客户端连接
  • 端口 5001:与摄像头服务(5000)分离,可并行运行
  • multipart/x-mixed-replace:HTTP 流式响应标准,浏览器原生支持播放

Part 3:客户端 — 多线程流接收与帧解码

客户端使用 QThread 在后台接收网络数据,解析 JPEG 帧后通过 Qt 信号传递给主线程渲染。

import requestsimport cv2import numpy as npfrom PyQt5.QtCore import QThread, pyqtSignalclassStreamThread(QThread):"""后台线程接收 MJPEG 屏幕流"""    frame_received = pyqtSignal(np.ndarray)    error_occurred = pyqtSignal(str)def__init__(self, url):        super().__init__()        self.url = url        self.running = Truedefrun(self):try:            response = requests.get(self.url, stream=True, timeout=10)            buf = b''for chunk in response.iter_content(chunk_size=8192):ifnot self.running:break                buf += chunk# JPEG 帧边界检测                start = buf.find(b'\xff\xd8')  # SOI 标记                end = buf.find(b'\xff\xd9')    # EOI 标记if start != -1and end != -1and end > start:                    jpg = buf[start:end + 2]                    buf = buf[end + 2:]                    frame = cv2.imdecode(                        np.frombuffer(jpg, dtype=np.uint8),                        cv2.IMREAD_COLOR                    )if frame isnotNone:                        self.frame_received.emit(frame)except requests.exceptions.ConnectionError:            self.error_occurred.emit("连接失败,请确认目标电脑服务端已启动")except requests.exceptions.Timeout:            self.error_occurred.emit("连接超时")except Exception as e:            self.error_occurred.emit(f"流接收错误: {e}")defstop(self):        self.running = False

技术要点:

  • chunk_size=8192:屏幕画面帧较大,增大 chunk 提升接收效率
  • SOI/EOI 帧边界:JPEG 文件固定以 0xFFD8 开始、0xFFD9 结束
  • 缓冲区累积:网络数据分片到达,累积直到检测到完整帧再解码
  • 信号机制frame_received 和 error_occurred 两个信号覆盖正常和异常场景
  • self.running 标志:支持外部调用 stop() 优雅退出线程

Part 4:客户端 — GUI 界面与设备管理

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QTableWidgetfrom PyQt5.QtGui import QImage, QPixmapfrom PyQt5.QtCore import QtclassScreenClient(QWidget):defopen_screen(self):        sn = self.open_sn_input.text().strip()if sn notin self.config:            self.status_label.setText(f"未找到 SN: {sn} 的配置")return        info = self.config[sn]        ip = info["ip"]        port = info.get("port"5001)        self.stop_stream()        url = f"http://{ip}:{port}/stream"        self.stream_thread = StreamThread(url)        self.stream_thread.frame_received.connect(self.update_frame)        self.stream_thread.error_occurred.connect(self.on_stream_error)        self.stream_thread.start()defupdate_frame(self, frame):        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)        h, w, ch = frame.shape        img = QImage(frame.data, w, h, ch * w, QImage.Format_RGB888)        scaled = QPixmap.fromImage(img).scaled(            self.video_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation        )        self.video_label.setPixmap(scaled)defstop_stream(self):if self.stream_thread:            self.stream_thread.stop()            self.stream_thread.wait(2000)            self.stream_thread = None

界面结构:

QVBoxLayout (主布局)├── QLabel "设备配置"├── QHBoxLayout (SN + IP + 端口 + 添加/删除按钮)├── QTableWidget (设备列表表格 3列: SN/IP/端口)├── QHBoxLayout (SN输入 + 连接/断开按钮)├── QLabel (屏幕画面显示区 960×540)└── QLabel (状态栏)

📄 配置文件说明

客户端运行后生成 screen_devices.json

{"5CD5145Y25": {"ip""192.168.1.100","port"5001  },"ABC1234567": {"ip""192.168.1.101","port"5001  },"XYZ9876543": {"ip""192.168.1.102","port"5001  }}
字段
类型
说明
Key
string
被控电脑的 BIOS 序列号
ip
string
被控电脑的局域网 IP 地址
port
int
服务端监听端口(默认 5001)

📡 API 接口文档

路由
方法
返回类型
描述
/sn
GET
JSON
获取本机 BIOS 序列号
/stream
GET
MJPEG Stream
实时屏幕视频流(浏览器可直接访问)
/stop
GET
JSON
停止视频流推送
/status
GET
JSON
查询当前服务状态

响应示例:

// GET /sn{"sn""5CD5145Y25"}// GET /status{"sn""5CD5145Y25""streaming"true}// GET /stop{"status""stopped"}

📚 知识点总结

1. 屏幕截取技术对比

速度
跨平台
依赖
适用场景
mss
⭐⭐⭐⭐⭐
Windows/Linux/Mac
纯 Python
高频截屏、视频流
Pillow ImageGrab
⭐⭐⭐
Windows/Mac
PIL
单次截图
pyautogui
⭐⭐
跨平台
PIL/Pillow
自动化测试
win32gui + BitBlt
⭐⭐⭐⭐
Windows
pywin32
最底层控制

mss 使用系统原生 API(Windows 上为 GDI),跳过了 Pillow 的图像对象封装开销, 直接返回原始像素缓冲区,适合高帧率场景。

2. MJPEG 流媒体传输原理

HTTP Response Header:  Content-Type: multipart/x-mixed-replace; boundary=frameBody (循环输出):  --frame\r\n  Content-Type: image/jpeg\r\n  \r\n  [JPEG 二进制数据]  \r\n  --frame\r\n  Content-Type: image/jpeg\r\n  \r\n  [下一帧 JPEG 数据]  ...
  • 每帧独立编码为 JPEG,无帧间依赖
  • 客户端通过 SOI(0xFFD8) 和 EOI(0xFFD9) 标记识别帧边界
  • 优点:实现简单、延迟低、浏览器原生支持
  • 缺点:带宽利用率低于 H.264/H.265 等视频编码

3. Python Generator 与流式响应

  • yield 关键字使函数变为生成器,惰性产出数据
  • Flask 的 Response 接受 Generator 对象作为参数,实现 HTTP 流式输出
  • 内存恒定:不论推流多久,内存占用不增长
  • 配合 while 循环实现无限流

4. PyQt5 多线程与信号槽

  • QThread:继承后重写 run() 方法,调用 start() 启动
  • pyqtSignal:类型安全的跨线程通信,参数类型在定义时指定
  • 线程安全原则:永远不在子线程中直接操作 GUI 控件
  • 退出机制:设置标志位 → 子线程检测后退出循环 → 主线程 wait() 等待

5. 图像格式转换链路

mss 截屏 (BGRA) → 去掉 Alpha (BGR) → cv2.resize (缩放)  → cv2.imencode (JPEG 编码) → 网络传输 → cv2.imdecode (解码)  → cv2.cvtColor (BGR→RGB) → QImage → QPixmap → QLabel 显示

🔮 拓展场景与测试步骤

拓展应用场景

场景
描述
🏫 电子教室
教师端实时查看学生电脑屏幕,监控学习状态
🏭 工控大屏监控
中控室查看各产线工控机的 HMI 画面
🖥️ 技术支持
远程查看用户屏幕辅助定位软件问题
📊 运维巡检
定时连接各服务器查看桌面状态并截图存档
🎮 直播投屏
将一台电脑的屏幕投射到另一台显示
🔒 合规审计
定期抽查员工桌面,确保无违规操作

进阶拓展方向

方向
实现思路
远程鼠标键盘操控
新增 /input POST 接口 + pyautogui 执行操作
多显示器支持
sct.monitors[2]
 截取第二块屏幕
自适应画质
根据网络带宽动态调整 JPEG 质量和分辨率
录制回放
服务端同时将帧写入 cv2.VideoWriter 保存为视频文件
WebSocket 升级
替换 HTTP 长连接为 WebSocket,支持双向通信
H.264 编码
使用 FFmpeg 替代 JPEG 实现帧间压缩,带宽降低 80%

测试步骤

Step 1:环境准备

# 服务端电脑pip install flask mss opencv-python numpy# 客户端电脑pip install opencv-python PyQt5 requests numpy

Step 2:网络连通性验证

# 在客户端 ping 服务端ping 192.168.1.100# 确认端口可达Test-NetConnection -ComputerName 192.168.1.100 -Port 5001

Step 3:服务端验证

python screen_server.py

验证项:

  • [ ] 控制台显示本机 SN
  • [ ] 浏览器访问 http://<IP>:5001/sn 返回 JSON
  • [ ] 浏览器访问 http://<IP>:5001/stream 能看到屏幕画面

Step 4:客户端连接测试

  • [ ] 启动 python screen_client.py
  • [ ] 添加设备(SN + IP + 端口)
  • [ ] 输入 SN → 点击「连接屏幕」
  • [ ] 确认画面显示正常,能看到远端桌面内容
  • [ ] 点击「断开」确认连接关闭

Step 5:性能测试

  • [ ] 观察服务端 CPU 占用(正常应在 10~25%)
  • [ ] 观察网络带宽(1280×720@15fps 约 5~10 Mbps)
  • [ ] 连续运行 30 分钟无内存泄漏

Step 6:多设备并发测试

  • [ ] 启动 3+ 台服务端
  • [ ] 客户端逐台切换连接
  • [ ] 确认切换流畅、无崩溃

Step 7:异常场景测试

测试项
操作
预期结果
服务端未启动
输入 SN 连接
提示"连接失败"
网络中断
拔网线
画面停止,提示错误
重复连接
连续点击连接
不崩溃,正常重建连接
未配置 SN
输入不存在的 SN
提示"未找到配置"

Step 8:防火墙配置(如连接失败)

# 服务端电脑开放 5001 端口(管理员 PowerShell)New-NetFirewallRule -DisplayName "Screen Share Server" -Direction Inbound -Port 5001 -Protocol TCP -Action Allow

📝 本系统为纯查看方案(只看屏幕不操控)。如需加入远程鼠标键盘操控功能,可在服务端新增 /input 接口配合 pyautogui 实现。端口 5001 与摄像头服务 5000 互不冲突,可同时运行。

服务
"""屏幕共享服务端 - 部署在每台被控电脑上启动后自动获取本机 BIOS SN,提供屏幕画面的 MJPEG 视频流依赖: pip install flask mss opencv-python numpy"""import subprocessimport timeimport cv2import numpy as npimport mssfrom flask import Flask, Response, jsonifyapp = Flask(name)streaming = Falsedef get_bios_sn():"""获取本机 BIOS 序列号"""try:result = subprocess.run(['wmic''bios''get''serialnumber'],capture_output=True, text=True, timeout=10)lines = [l.strip() for l in result.stdout.strip().split('\n'if l.strip()]if len(lines) >= 2:return lines[1]except Exception:passreturn "UNKNOWN"LOCAL_SN = get_bios_sn()def generate_frames():"""截取屏幕生成 MJPEG 视频流"""global streamingstreaming = Truewith mss.mss() as sct:    monitor = sct.monitors[1]  # 主显示器    while streaming:        # 截取屏幕        img = sct.grab(monitor)        # mss 返回 BGRA 格式,转为 BGR        frame = np.array(img)[:, :, :3]        # 缩放到 1280x720 降低带宽        frame = cv2.resize(frame, (1280720), interpolation=cv2.INTER_AREA)        # JPEG 编码,质量 55(平衡画质和带宽)        _, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 55])        yield (b'--frame\r\n'               b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')        # 控制帧率约 15fps        time.sleep(0.066)@app.route('/sn')def get_sn():"""获取本机 SN"""return jsonify({"sn": LOCAL_SN})@app.route('/stream')def video_stream():"""屏幕共享视频流"""return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')@app.route('/stop')def stop_stream():"""停止推流"""global streamingstreaming = Falsereturn jsonify({"status""stopped"})@app.route('/status')def status():"""查询状态"""return jsonify({"sn": LOCAL_SN, "streaming": streaming})if name == 'main':print(f"[屏幕共享服务端] 本机 SN: {LOCAL_SN}")print(f"[屏幕共享服务端] 监听端口: 5001")print(f"[屏幕共享服务端] 屏幕流地址: http://<本机IP>:5001/stream")app.run(host='0.0.0.0', port=5001, threaded=True)
客户端
"""屏幕共享客户端 GUI - 在控制端运行输入 SN 即可查看对应电脑的屏幕画面依赖: pip install opencv-python PyQt5 requests numpy"""import sysimport osimport jsonimport requestsimport cv2import numpy as npfrom PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,QLabel, QLineEdit, QPushButton, QTableWidget, QTableWidgetItem,QMessageBox, QHeaderView, QSpinBox)from PyQt5.QtGui import QImage, QPixmapfrom PyQt5.QtCore import Qt, QThread, pyqtSignalCONFIG_FILE = os.path.join(os.path.dirname(os.path.abspath(file)), "screen_devices.json")def load_config():if os.path.exists(CONFIG_FILE):with open(CONFIG_FILE, "r", encoding="utf-8"as f:return json.load(f)return {}def save_config(config):with open(CONFIG_FILE, "w", encoding="utf-8"as f:json.dump(config, f, indent=2, ensure_ascii=False)class StreamThread(QThread):"""后台线程接收 MJPEG 屏幕流"""frame_received = pyqtSignal(np.ndarray)error_occurred = pyqtSignal(str)def __init__(self, url):    super().__init__()    self.url = url    self.running = Truedef run(self):    try:        response = requests.get(self.url, stream=True, timeout=10)        buf = b''        for chunk in response.iter_content(chunk_size=8192):            if not self.running:                break            buf += chunk            # 查找 JPEG 帧边界            start = buf.find(b'\xff\xd8')            end = buf.find(b'\xff\xd9')            if start != -1 and end != -1 and end > start:                jpg = buf[start:end + 2]                buf = buf[end + 2:]                frame = cv2.imdecode(                    np.frombuffer(jpg, dtype=np.uint8),                    cv2.IMREAD_COLOR                )                if frame is not None:                    self.frame_received.emit(frame)    except requests.exceptions.ConnectionError:        self.error_occurred.emit("连接失败,请确认目标电脑服务端已启动")    except requests.exceptions.Timeout:        self.error_occurred.emit("连接超时")    except Exception as e:        self.error_occurred.emit(f"流接收错误: {e}")def stop(self):    self.running = Falseclass ScreenClient(QWidget):def init(self):super().init()self.setWindowTitle("远程屏幕共享客户端")self.resize(1000700)    self.config = load_config()    self.stream_thread = None    self.init_ui()    self.refresh_table()def init_ui(self):    layout = QVBoxLayout()    # 设备配置区域    layout.addWidget(QLabel("设备配置 (SN → IP 地址):"))    config_layout = QHBoxLayout()    config_layout.addWidget(QLabel("SN:"))    self.sn_input = QLineEdit()    self.sn_input.setPlaceholderText("电脑 BIOS SN")    config_layout.addWidget(self.sn_input)    config_layout.addWidget(QLabel("IP:"))    self.ip_input = QLineEdit()    self.ip_input.setPlaceholderText("如 192.168.1.100")    config_layout.addWidget(self.ip_input)    config_layout.addWidget(QLabel("端口:"))    self.port_spin = QSpinBox()    self.port_spin.setRange(165535)    self.port_spin.setValue(5001)    config_layout.addWidget(self.port_spin)    self.btn_add = QPushButton("添加/更新")    self.btn_add.clicked.connect(self.add_device)    config_layout.addWidget(self.btn_add)    self.btn_delete = QPushButton("删除选中")    self.btn_delete.clicked.connect(self.delete_device)    config_layout.addWidget(self.btn_delete)    layout.addLayout(config_layout)    # 设备列表表格    self.table = QTableWidget()    self.table.setColumnCount(3)    self.table.setHorizontalHeaderLabels(["SN""IP""端口"])    self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)    self.table.setMaximumHeight(130)    self.table.setSelectionBehavior(QTableWidget.SelectRows)    layout.addWidget(self.table)    # 连接操作区    open_layout = QHBoxLayout()    open_layout.addWidget(QLabel("输入 SN 查看远程屏幕:"))    self.open_sn_input = QLineEdit()    self.open_sn_input.setPlaceholderText("输入已配置的电脑 SN")    open_layout.addWidget(self.open_sn_input)    self.btn_open = QPushButton("连接屏幕")    self.btn_open.clicked.connect(self.open_screen)    open_layout.addWidget(self.btn_open)    self.btn_stop = QPushButton("断开")    self.btn_stop.clicked.connect(self.stop_stream)    open_layout.addWidget(self.btn_stop)    layout.addLayout(open_layout)    # 屏幕画面显示    self.video_label = QLabel("远程屏幕画面")    self.video_label.setMinimumSize(960540)    self.video_label.setStyleSheet("background-color: #1a1a2e; color: #aaa; font-size: 16px;")    self.video_label.setAlignment(Qt.AlignCenter)    layout.addWidget(self.video_label)    # 状态栏    self.status_label = QLabel("就绪")    layout.addWidget(self.status_label)    self.setLayout(layout)def refresh_table(self):    self.table.setRowCount(0)    for sn, info in self.config.items():        row = self.table.rowCount()        self.table.insertRow(row)        self.table.setItem(row, 0, QTableWidgetItem(sn))        if isinstance(info, dict):            self.table.setItem(row, 1, QTableWidgetItem(info.get("ip""")))            self.table.setItem(row, 2, QTableWidgetItem(str(info.get("port"5001))))        else:            self.table.setItem(row, 1, QTableWidgetItem(str(info)))            self.table.setItem(row, 2, QTableWidgetItem("5001"))def add_device(self):    sn = self.sn_input.text().strip()    ip = self.ip_input.text().strip()    port = self.port_spin.value()    if not sn or not ip:        QMessageBox.warning(self"提示""请输入 SN 和 IP 地址")        return    self.config[sn] = {"ip": ip, "port": port}    save_config(self.config)    self.refresh_table()    self.status_label.setText(f"已保存: {sn} → {ip}:{port}")def delete_device(self):    row = self.table.currentRow()    if row < 0:        return    sn = self.table.item(row, 0).text()    del self.config[sn]    save_config(self.config)    self.refresh_table()    self.status_label.setText(f"已删除: {sn}")def open_screen(self):    sn = self.open_sn_input.text().strip()    if not sn:        self.status_label.setText("请输入 SN")        return    if sn not in self.config:        self.status_label.setText(f"未找到 SN: {sn} 的配置,请先添加设备")        return    info = self.config[sn]    if isinstance(info, dict):        ip = info["ip"]        port = info.get("port"5001)    else:        ip = str(info)        port = 5001    self.stop_stream()    url = f"http://{ip}:{port}/stream"    self.status_label.setText(f"正在连接 {ip}:{port} ...")    self.stream_thread = StreamThread(url)    self.stream_thread.frame_received.connect(self.update_frame)    self.stream_thread.error_occurred.connect(self.on_stream_error)    self.stream_thread.start()def update_frame(self, frame):    self.status_label.setText("正在接收屏幕画面...")    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)    h, w, ch = frame.shape    img = QImage(frame.data, w, h, ch * w, QImage.Format_RGB888)    scaled = QPixmap.fromImage(img).scaled(        self.video_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation    )    self.video_label.setPixmap(scaled)def on_stream_error(self, msg):    self.status_label.setText(f"错误: {msg}")def stop_stream(self):    if self.stream_thread:        self.stream_thread.stop()        self.stream_thread.wait(2000)        self.stream_thread = None    self.video_label.clear()    self.video_label.setText("远程屏幕画面")    self.status_label.setText("已断开")def closeEvent(self, event):    self.stop_stream()    event.accept()if name == 'main':app = QApplication(sys.argv)window = ScreenClient()window.show()sys.exit(app.exec_())

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-02 21:58:47 HTTP/2.0 GET : https://f.mffb.com.cn/a/502596.html
  2. 运行时间 : 0.466702s [ 吞吐率:2.14req/s ] 内存消耗:4,748.49kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=369df9d5f98fd614f0db152945d9f575
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001218s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001848s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.045026s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000726s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001320s ]
  6. SELECT * FROM `set` [ RunTime:0.010160s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001623s ]
  8. SELECT * FROM `article` WHERE `id` = 502596 LIMIT 1 [ RunTime:0.025578s ]
  9. UPDATE `article` SET `lasttime` = 1783000728 WHERE `id` = 502596 [ RunTime:0.062828s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.005834s ]
  11. SELECT * FROM `article` WHERE `id` < 502596 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.024967s ]
  12. SELECT * FROM `article` WHERE `id` > 502596 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.020522s ]
  13. SELECT * FROM `article` WHERE `id` < 502596 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.031937s ]
  14. SELECT * FROM `article` WHERE `id` < 502596 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.008249s ]
  15. SELECT * FROM `article` WHERE `id` < 502596 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.022304s ]
0.470088s