From 6042eaa8630daecfd809eaf38086766a9106268a Mon Sep 17 00:00:00 2001 From: "WIN-87ES3P38OPV\\EDY" Date: Tue, 28 Jul 2026 17:00:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 9 +++++++- preload.js | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 preload.js diff --git a/main.js b/main.js index 50fca41..c5902b8 100644 --- a/main.js +++ b/main.js @@ -8,11 +8,18 @@ * @Version: 1.0.0 */ const { app, BrowserWindow } = require('electron') +const path = require('path') const createWindow = () => { const win = new BrowserWindow({ width: 800, - height: 600 + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false + } }) win.loadFile('./dist/index.html') diff --git a/preload.js b/preload.js new file mode 100644 index 0000000..fc0e487 --- /dev/null +++ b/preload.js @@ -0,0 +1,67 @@ +/* + * @Author: 李皓 hao_li_work@163.com + * @Date: 2026-07-28 16:31:45 + * @LastEditors: 李皓 hao_li_work@163.com + * @LastEditTime: 2026-07-28 16:44:07 + * @FilePath: \pc\preload.js + * @Description: + * @Version: 1.0.0 + */ +const { contextBridge } = require('electron') +const nodeNet = require('net') +const dns = require('dns') + +/** + * 尝试通过 TCP 连接指定端口检测主机是否可达 + */ +function tryConnect(host, port, timeout) { + return new Promise((resolve) => { + const socket = new nodeNet.Socket() + socket.setTimeout(timeout) + socket.on('connect', () => { socket.destroy(); resolve(true) }) + socket.on('error', () => { socket.destroy(); resolve(false) }) + socket.on('timeout', () => { socket.destroy(); resolve(false) }) + socket.connect(port, host) + }) +} + +/** + * 网络检测对象 + */ +const networkUtil = { + /** + * 检测目标主机网络连通性 + * @param {string} host - 目标主机地址 + * @param {number} timeout - 超时时间(毫秒) + * @returns {Promise} - 是否可达 + */ + async ping(host, timeout) { + // 1. 先检查 DNS 能否解析 + try { + await dns.promises.resolve(host) + } catch { + return false + } + + // 2. 依次尝试常见端口(443 优先,80 兜底) + const ports = [443, 80] + for (const port of ports) { + const ok = await tryConnect(host, port, timeout) + if (ok) return true + } + + return false + } +} + +/** + * 应用传感器对象 + */ +const appSensor = { + version: '1.0.0', + name: 'appSensor' +} + +// 安全暴露 API 给渲染进程(挂载到 window.net,页面中可用 net.ping() 调用) +contextBridge.exposeInMainWorld('net', networkUtil) +contextBridge.exposeInMainWorld('appSensor', appSensor)