构建NPS内网穿透服务客户端GUI界面

2024-04-07 20:28

本文主要是介绍构建NPS内网穿透服务客户端GUI界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1、问题来源
    • 2、操作教程
      • 2.1 原理
      • 2.2 NPS_GUI界面代码
      • 2.3 python 程序转 exe 程序
    • 3、总结

1、问题来源

本人之前撰写过一个 使用nps搭建内网穿透并配置泛域名解析的教程,但其中的运行客户端程序使用的是 CMD 命令行进行操作,并且需要配置的参数较多,总是记不住。

所以就在考虑是否能将 cmd 命令程序转成 EXE GUI程序,方便配置参数运行。本教程就营运而生了。

2、操作教程

2.1 原理

PySimpleGUI是一个用于创建图形用户界面(GUI)的Python模块。本教程使用 PySimpleGUI 为 NPS内网穿透客户端程序(v0.26.0)制作了一个GUI界面。

2.2 NPS_GUI界面代码

首先新建一个目录为 nps_gui ,在目录中新建一个 main.py 程序,并将与 nps 服务端配套的 npc.exe 文件复制到该目录下。
main.py 程序为主程序,用来绘制 GUI 界面,调用 CMD 命令运行程序。
main.py 程序内容如下:

# main.pyimport subprocess
import threading
import PySimpleGUI as sg# 定义版本号和作者信息
version = "0.0.1"
author = "巧遇科技工作室"
about_me = "本程序是NPS内网穿透服务的GUI界面,用来辅助NPS内网穿透服务客户端进行使用,与之配套的NPS版本为0.26.10。"def read_output(process, output_element):"""读取子进程的输出并将其传递给GUI线程显示的函数"""for line in process.stdout:output_element.print(line.strip())for line in process.stderr:output_element.print(line.strip())# 定义GUI布局
layout = [[sg.Menu([['关于', ['本程序介绍','版本号', '作者']]])],[sg.Text("服务端地址(IP):"), sg.Input(default_text="nps.qiaoyukeji.cn",key="-ADDRESS-")],[sg.Text("服务端端口号:"), sg.Input(default_text="28024",key="-PORT-")],[sg.Text("验证密钥(vkey):"), sg.Input(key="-VKEY-")],[sg.Text("连接方式:"), sg.Input(default_text="tcp",key="-TYPE-")],[sg.Button("连接远程穿透服务器"), sg.Button("退出")],[sg.Output(size=(60, 10), key="-OUTPUT-")]
]# 创建窗口
window = sg.Window("NPS内网穿透GUI工具(v0.0.1)", layout)
output_element = window["-OUTPUT-"]# 事件循环
while True:event, values = window.read()if event == sg.WINDOW_CLOSED or event == "退出":breakif event == "连接远程穿透服务器":address = values["-ADDRESS-"]port = values["-PORT-"]vkey = values["-VKEY-"]type = values["-TYPE-"]command = f"npc.exe -server={address}:{port} -vkey={vkey} -type={type}"startupinfo = subprocess.STARTUPINFO()startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOWprocess = subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,bufsize=1,startupinfo=startupinfo,creationflags=subprocess.CREATE_NO_WINDOW)# 创建线程读取子进程输出并传递给GUI线程显示output_thread = threading.Thread(target=read_output, args=(process, output_element), daemon=True)output_thread.start()if event == "版本号":sg.popup(f"版本号: {version}")if event == "作者":sg.popup(f"作者: {author}")if event == "本程序介绍":sg.popup(f"{about_me}")# 关闭窗口
window.close()

目录下输入 python main.py 运行程序,程序的运行图如下所示。

填写好自己的 nps 服务端的 网址(IP)、端口、验证密钥(vkey)与连接方式,点击连接显示连接成功。

至此,python 代码版的 nps 客户端 GUI 程序已完成。

2.3 python 程序转 exe 程序

python 版的程序虽然已经完成,但是需要电脑先安装 python 运行环境,并且安装对应的 python 库,之后运行 python 代码才能正真的运行起来程序,对于普通人来说过于麻烦与繁琐了。

能不能打包成 exe 文件,无需安装,双击就能运行呢?

答案是肯定的,就是使用 pyinstaller
PyInstaller 是一个用于将 Python 应用程序打包成可执行文件的工具。它可以将 Python 脚本及其依赖的库、资源文件等打包成一个独立的可执行文件,方便在没有 Python 解释器的环境中运行。

首先安装使用 pip install pyinstaller 安装 pyinstaller
之后在上面的目录中运行 PyInstaller 打包程序;

pyinstaller --onefile --hidden-import PySimpleGUI main.py --name "NPS内网穿透客户端GUI程序"  --noconsole

–onefile:指定生成一个单个的可执行文件,而不是生成一个文件夹包含多个文件。这意味着所有的依赖项将被打包到一个可执行文件中。

–hidden-import PySimpleGUI:指定需要导入的额外模块或库。在这个例子中,指定了需要导入PySimpleGUI库,因为脚本"main.py"中使用了PySimpleGUI。这样PyInstaller会确保将该库包含在生成的可执行文件中。

main.py:要打包的Python脚本的文件名或路径。在这个例子中,指定了"main.py"作为要打包的脚本。

–name “NPS内网穿透客户端GUI程序”:指定生成的可执行文件的名称。在这个例子中,指定了生成的可执行文件的名称为"NPS内网穿透客户端GUI程序"。

–noconsole:指定生成的可执行文件在运行时不显示控制台窗口。这适用于图形用户界面(GUI)应用程序,因为它们通常不需要显示控制台输出。

上述打包程序就可以在目录下生成一个 dist 目录、将 main.py 打包成一个 exe 程序放置在 dist 目录中,然后我们需要将 npc.exe 也复制一份到 dist 目录中。


dist 目录中双击 NPS内网穿透客户端GUI程序.exe 即可正常运行 NPS_GUI 程序。

我们可以将 NPS内网穿透客户端GUI程序.exenpc.exe 两个文件打包成一个压缩包发送给他人,他人无需安装配置运行环境、仅需解压缩后双击程序即可运行程序。

至此 nps 客户端程序 GUI 界面程序已全部完成。

3、总结

本教程已在 Gitee、Github中进行开源。
Gitee:https://gitee.com/qiaoyukeji/nps_gui
Github:https://github.com/qiaoyukeji/nps_gui

本教程使用的是 PySimpleGUI 绘制 GUI 界面,由于 PySimpleGUI 库本身的问题,第一次使用会提示填入授权码或者选择忽略跳过
授权码 PySimpleGUI 官方免费提供,但需要注册领取,填入注册授权码后可一直免费使用。
选择忽略将导致 PySimpleGUI 绘制的程序将只能试用31天,注册填入授权码即可解决


本文首发于本人博客:https://blog.gitnote.cn/post/nps_gui/index.html

版权信息: CC BY-NC-SA 4.0 (自由转载-非商用-相同方式共享-保持署名)

这篇关于构建NPS内网穿透服务客户端GUI界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883586

相关文章

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen