当前位置: 首页 > wzjs >正文

wordpress显示网站在线人数西安风险等级最新

wordpress显示网站在线人数,西安风险等级最新,深圳公司贷款,移动局域网ip做网站Electron 开发:获取当前客户端 IP 一、背景与需求 1. 项目背景 客户端会自启动一个服务,Web/后端服务通过 IP port 请求以操作客户端接口 2. 初始方案与问题 2.1. 初始方案:通过代码获取本机 IP /*** 获取局域网 IP* returns {string}…

Electron 开发:获取当前客户端 IP

一、背景与需求

1. 项目背景

客户端会自启动一个服务,Web/后端服务通过 IP + port 请求以操作客户端接口

2. 初始方案与问题

2.1. 初始方案:通过代码获取本机 IP
/*** 获取局域网 IP* @returns {string} 局域网 IP*/
export function getLocalIP(): string {const interfaces = os.networkInterfaces()for (const name of Object.keys(interfaces)) {for (const iface of interfaces[name] || []) {if (iface.family === 'IPv4' && !iface.internal) {log.info('获取局域网 IP:', iface.address)return iface.address}}}log.warn('无法获取局域网 IP,使用默认 IP: 127.0.0.1')return '127.0.0.1'
}
2.2. 遇到的问题

如果设备开启了代理,可能获取的是代理 IP,导致后端请求失败

二、解决方案设计

1. 总体思路

  • 获取本机所有 IP
  • 遍历 IP + port 请求客户端服务接口
  • 成功响应即为目标 IP
  • 缓存有效 IP,避免频繁请求

2. 获取所有可能的 IP

使用 Node.js 的 os.networkInterfaces() 获取所有可用 IP

private getAllPossibleIPs(): string[] {const interfaces = os.networkInterfaces()const result: string[] = []for (const name of Object.keys(interfaces)) {const lowerName = name.toLowerCase()if (lowerName.includes('vmware')|| lowerName.includes('virtual')|| lowerName.includes('vpn')|| lowerName.includes('docker')|| lowerName.includes('vethernet')) {continue}for (const iface of interfaces[name] || []) {if (iface.family === 'IPv4' && !iface.internal) {result.push(iface.address)}}}return result
}

3. 遍历 IP 请求验证

轮询所有 IP,尝试访问客户端服务,验证是否可用

private async testIPsParallel(ips: string[]): Promise<string | null> {if (ips.length === 0)return nullreturn new Promise((resolve) => {const globalTimeout = setTimeout(() => {resolve(null)}, this.TIMEOUT * 1.5)const controllers = ips.map(() => new AbortController())let hasResolved = falselet completedCount = 0const testIP = (ip: string, index: number) => {const controller = controllers[index]axios.get(`http://${ip}:${PORT}/api/task-server/ip`, {timeout: this.TIMEOUT,signal: controller.signal,}).then(() => {if (!hasResolved) {hasResolved = trueclearTimeout(globalTimeout)controllers.forEach((c, i) => {if (i !== index)c.abort()})resolve(ip)}}).catch(() => {if (!hasResolved) {completedCount++if (completedCount >= ips.length) {clearTimeout(globalTimeout)resolve(null)}}})}ips.forEach(testIP)})
}

4. 添加缓存策略

对成功的 IP 进行缓存,设定缓存有效时间,避免重复请求

private cachedValidIP: string | null = null
private lastValidationTime = 0
private readonly CACHE_VALID_DURATION = 24 * 60 * 60 * 1000

三、完整代码

import os from 'node:os'
import axios from 'axios'
import { PORT } from '../../enum/env'/*** IP管理器单例类* 用于获取并缓存本地有效IP地址*/
export class IPManager {private static instance: IPManagerprivate cachedValidIP: string | null = nullprivate lastValidationTime = 0private readonly CACHE_VALID_DURATION = 24 * 60 * 60 * 1000private readonly TIMEOUT = 200private isTestingIPs = falseprivate constructor() {}static getInstance(): IPManager {if (!IPManager.instance) {IPManager.instance = new IPManager()}return IPManager.instance}async getLocalIP(): Promise<string> {const now = Date.now()if (this.cachedValidIP && now - this.lastValidationTime < this.CACHE_VALID_DURATION) {console.log('从缓存中获取 IP', this.cachedValidIP)return this.cachedValidIP}if (this.isTestingIPs) {const allIPs = this.getAllPossibleIPs()return allIPs.length > 0 ? allIPs[0] : '127.0.0.1'}this.isTestingIPs = truetry {const allIPs = this.getAllPossibleIPs()if (allIPs.length === 0) {return '127.0.0.1'}const validIP = await this.testIPsParallel(allIPs)if (validIP) {this.cachedValidIP = validIPthis.lastValidationTime = nowreturn validIP}return allIPs[0]}catch (error) {const allIPs = this.getAllPossibleIPs()return allIPs.length > 0 ? allIPs[0] : '127.0.0.1'}finally {this.isTestingIPs = false}}private getAllPossibleIPs(): string[] {const interfaces = os.networkInterfaces()const result: string[] = []for (const name of Object.keys(interfaces)) {const lowerName = name.toLowerCase()if (lowerName.includes('vmware')|| lowerName.includes('virtual')|| lowerName.includes('vpn')|| lowerName.includes('docker')|| lowerName.includes('vethernet')) {continue}for (const iface of interfaces[name] || []) {if (iface.family === 'IPv4' && !iface.internal) {result.push(iface.address)}}}return result}private async testIPsParallel(ips: string[]): Promise<string | null> {if (ips.length === 0)return nullreturn new Promise((resolve) => {const globalTimeout = setTimeout(() => {resolve(null)}, this.TIMEOUT * 1.5)const controllers = ips.map(() => new AbortController())let hasResolved = falselet completedCount = 0const testIP = (ip: string, index: number) => {const controller = controllers[index]axios.get(`http://${ip}:${PORT}/api/task-server/ip`, {timeout: this.TIMEOUT,signal: controller.signal,// validateStatus: status => status === 200,}).then(() => {if (!hasResolved) {hasResolved = trueclearTimeout(globalTimeout)controllers.forEach((c, i) => {if (i !== index)c.abort()})resolve(ip)}}).catch(() => {if (!hasResolved) {completedCount++if (completedCount >= ips.length) {clearTimeout(globalTimeout)resolve(null)}}})}ips.forEach(testIP)})}
}/*** 获取本地有效IP地址*/
export async function getLocalIP(): Promise<string> {return IPManager.getInstance().getLocalIP()
}

文章转载自:

http://8pEpS1f3.Lmrcq.cn
http://zZYtq7eH.Lmrcq.cn
http://WsFSxfzW.Lmrcq.cn
http://4pTTBTeB.Lmrcq.cn
http://PWGyU2vT.Lmrcq.cn
http://QiR0XoHD.Lmrcq.cn
http://g5lsdyvC.Lmrcq.cn
http://3MIoBfql.Lmrcq.cn
http://1lRCCVcb.Lmrcq.cn
http://Aj7KRf2A.Lmrcq.cn
http://CjHMYBeh.Lmrcq.cn
http://xCPL7w1W.Lmrcq.cn
http://98VVBDI9.Lmrcq.cn
http://TYlLQEBP.Lmrcq.cn
http://dmwk6VEu.Lmrcq.cn
http://zztdaB94.Lmrcq.cn
http://urHAU0A7.Lmrcq.cn
http://B2RZrMRc.Lmrcq.cn
http://fewoJsQ9.Lmrcq.cn
http://MKOstV4i.Lmrcq.cn
http://rYfdsOST.Lmrcq.cn
http://5MnikbJK.Lmrcq.cn
http://hp0Vcdt8.Lmrcq.cn
http://7sf9gq4P.Lmrcq.cn
http://f5YW1WLc.Lmrcq.cn
http://shglTxI0.Lmrcq.cn
http://7U50kJzl.Lmrcq.cn
http://6SvcSWdr.Lmrcq.cn
http://rorAwiAi.Lmrcq.cn
http://qiLSdftk.Lmrcq.cn
http://www.dtcms.com/wzjs/774391.html

相关文章:

  • 中山市建网站公司中山最好的网站建设公司哪家好
  • 做非法网站的有没有做商城网站要哪些流程图
  • 专门做地方特产的网站南宁模板开发建站
  • 名校长工作室网站建设羊了个羊开发公司
  • 网站服务器多少钱一年无经验可以做网站编辑吗
  • 网站地图制作方法广州商旅网站制作
  • 如何发布一个网站新网企业邮箱登录入口
  • 网站开发实训内容业绩统计网站开发
  • 网站开发 360百科菏泽做网站推广
  • 微信网站 微信支付设计公司组织架构
  • 那个网站做外贸做网站竞价怎么找客户
  • 做购物网站学什么技术网站收录下降
  • 旅游网站的建设方案统一身份认证平台
  • 一个网站的制作过程从化营销型网站建设
  • 百度做网站多少钱一年旅游网站建设成本核算
  • 免费做网站站标哈尔滨企业网站seo
  • 南京做网站价格上海市工程质量建设管理协会网站
  • 空气能空调如何做网站vps做网站的环境
  • 网站语言版本建设厅网站装修合同模板
  • 青岛网站建设大全毛绒玩具东莞网站建设
  • 定制网站与模板网站的主要区别如何增加网站板块
  • 中国住建部网站查询网对接标准做好门户网站建设
  • 网站建设实践描述三优科技 网站开发
  • 西安网站推广方案菜单点开404 wordpress
  • 网站建设情况 报告WordPress网站被恶意登录
  • 怎么查看网站是否备案谷歌收录网站
  • 差异基因做聚类分析网站wordpress自动图床
  • 深圳网站建设电话咨询wordpress 媒体库缩略图生成
  • 大城县建设局网站如何用网站首页做404
  • 微信网站域名入侵wordpress