乐于分享
好东西不私藏

源码来了:Windows 端口查看器 PortLite,Wails + Go 实现

源码来了:Windows 端口查看器 PortLite,Wails + Go 实现

上一篇写完 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 打包都过了。

当前环境和结果如下:

项目
版本 / 数据
操作系统
Windows 11 Home Chinese, Build 26200
CPU
AMD Ryzen 7 8745H
Go
go1.25.0 windows/amd64
Node.js
v24.14.1
npm
11.11.0
Wails
v3.0.0-alpha.78
打包产物
PortLite.exe
产物体积
8.75 MB

这个结果只代表我的机器、当前 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.OptionsName:        "PortLite"Description: "Windows local port watcher built with Wails"Services: []application.Serviceapplication.NewService(&PortService{}), }, Assets: application.AssetOptionsHandler: application.AssetFileServerFS(assets), }, }) 

前端并不直接碰 Windows API。

Vue 页面只调用 Go 暴露出来的方法,拿到端口列表以后做展示、搜索和筛选。真正和 Windows 端口、进程打交道的逻辑在 portservice_windows.go 里。

这里我没有把代码写得很绕,思路大概就是:

查系统 TCP / UDP 表,拿到本地地址、远程地址、端口、状态和 PID;再根据 PID 补进程名和进程路径;最后把整理好的列表返回给前端。

这样拆开以后,前端就很轻,只关心“怎么让人看得清楚”。

为什么第一版没有做很多功能

我一开始也想过往里面加很多东西。

比如后台常驻、端口变化监听、托盘图标、导出报告、只看监听端口、复制排查信息。

想法不少,但第一版最后还是忍住了。

因为这个工具最核心的问题就一个:本地服务起不来时,我想知道端口被谁占了。

这个问题还没解决好之前,先堆一堆功能,很容易把一个小工具做成另一个复杂软件。对我来说,这种项目更适合先做成能解决一个具体麻烦的版本,后面真的用到了,再往上加。

目前我比较想加的反而不是大功能,而是两个很小的东西:

  • 只看监听端口,排查本地服务时更直接一点。
  • 复制排查信息,方便把端口、PID、进程路径发给同事。

至于批量结束进程、自动清理这些,我暂时不想急着做。排查工具第一件事还是看清楚,真要动进程,慢一点没坏处。

这篇先把源码补上。

之前只是放了效果和截图,这次把项目地址、运行方式和核心结构都整理出来。想试 Wails 做本地小工具的话,可以先把 PortLite 跑起来,再改一个自己平时真的会用的小功能。