上一篇写完 Windows 端口查看器以后,评论区有不少朋友问源码。
所以这篇先不绕,源码地址放前面:
https://github.com/fengfengzhidao/port_lite 项目叫 PortLite,用 Wails v3 + Go + Vue 写的。
它解决的问题很小:本地服务启动失败,提示端口被占用时,快速看一下到底是哪个进程占了这个端口。
这个场景应该很多人都碰过。比如起一个后端服务,发现 8080 被占了;起一个前端项目,发现 5173 已经有人在用;或者 Docker、数据库、网关这些东西跑多了以后,本地端口越来越乱。
Windows 不是不能查,命令也一直在那里:
netstat -ano | findstr :8080tasklist | findstr 12345但每次都要先查端口,再看 PID,再反查进程名。有时候还要去任务管理器里找路径。
偶尔查一次还好,开发环境开得多了,这个动作就有点烦。
PortLite 做的事情,就是把这几步放到一个小窗口里。
当前版本能做什么
这个项目目前还是一个很克制的小工具,没有做成完整的进程管理器。
现在主要有这些功能:
查看本机 TCP / UDP 端口 显示本地地址、远程地址、TCP 状态、PID、进程名、进程路径 按端口、进程名、PID、地址、路径搜索 按协议和 TCP 状态筛选 手动刷新端口列表 确认后结束占用端口的进程
这里有个点要先说清楚。
所谓“结束端口”,本质上不是关闭某一个端口,而是结束占用这个端口的进程。
所以我没有做一键批量结束,也没有做自动清理。点“结束进程”之前会弹确认框,而且 PID 0、PID 4、PortLite 自己的进程都不能结束。
这个工具的定位还是本地开发排查,不是替代任务管理器。
怎么跑起来
先把代码拉下来:
git clone git@github.com:fengfengzhidao/port_lite.git cd port_lite 安装前端依赖:
cd frontend npm install cd .. 开发模式运行:
wails3 dev 如果只是想打一个 exe:
wails3 task build Windows 下默认产物在:
bin/PortLite.exe 我这边打出来的 exe 是 8.75 MB。
开源前重新验证了一遍
这次整理开源前,我又重新跑了一遍构建和测试。
cd frontend npm run build cd .. go test ./... wails3 task build 前端构建、Go 测试、Wails 打包都过了。
当前环境和结果如下:
PortLite.exe | |
这个结果只代表我的机器、当前 Demo 和当前打包配置,不代表所有 Wails 项目。
但作为一个本地小工具,它至少说明一件事:如果只是做这种轻量桌面工具,Wails 的基础成本确实不高。
项目结构不复杂
项目本身不大,核心文件就几个:
. ├── main.go ├── portservice_windows.go ├── portservice_other.go ├── portservice_windows_test.go ├── frontend ├── build └── Taskfile.yml main.go 是 Wails 应用入口,主要负责创建窗口、注册 Go 服务、加载前端资源。
里面比较关键的是这段:
app := application.New(application.Options{ Name: "PortLite", Description: "Windows local port watcher built with Wails", Services: []application.Service{ application.NewService(&PortService{}), }, Assets: application.AssetOptions{ Handler: application.AssetFileServerFS(assets), }, }) 前端并不直接碰 Windows API。
Vue 页面只调用 Go 暴露出来的方法,拿到端口列表以后做展示、搜索和筛选。真正和 Windows 端口、进程打交道的逻辑在 portservice_windows.go 里。
这里我没有把代码写得很绕,思路大概就是:
查系统 TCP / UDP 表,拿到本地地址、远程地址、端口、状态和 PID;再根据 PID 补进程名和进程路径;最后把整理好的列表返回给前端。
这样拆开以后,前端就很轻,只关心“怎么让人看得清楚”。
为什么第一版没有做很多功能
我一开始也想过往里面加很多东西。
比如后台常驻、端口变化监听、托盘图标、导出报告、只看监听端口、复制排查信息。
想法不少,但第一版最后还是忍住了。
因为这个工具最核心的问题就一个:本地服务起不来时,我想知道端口被谁占了。
这个问题还没解决好之前,先堆一堆功能,很容易把一个小工具做成另一个复杂软件。对我来说,这种项目更适合先做成能解决一个具体麻烦的版本,后面真的用到了,再往上加。
目前我比较想加的反而不是大功能,而是两个很小的东西:
只看监听端口,排查本地服务时更直接一点。 复制排查信息,方便把端口、PID、进程路径发给同事。
至于批量结束进程、自动清理这些,我暂时不想急着做。排查工具第一件事还是看清楚,真要动进程,慢一点没坏处。
这篇先把源码补上。
之前只是放了效果和截图,这次把项目地址、运行方式和核心结构都整理出来。想试 Wails 做本地小工具的话,可以先把 PortLite 跑起来,再改一个自己平时真的会用的小功能。
夜雨聆风