本地开发时总会碰到端口被占的情况。”address already in use” — 然后你打开终端,敲 lsof -i :8080,找到 PID,再 kill -9。三四个命令下来,最后发现是上礼拜跑的一个 Next.js dev server 没关。

这种高频摩擦我受够了,于是写了 Port Manager — 一个跨平台桌面端口管理工具。打开即用,搜索、查看、打开、终止,全在 GUI 里点几下完成。

他能做什么

扫描和搜索。 启动自动扫描本机所有 TCP/UDP 端口占用。按端口号、PID、进程名、本地地址、远程地址搜索,按协议筛选 TCP/UDP/全部。

详细信息。 点击任意端口,展开完整进程细节:PID、父进程 PID、用户、运行时长、启动命令、本地和远程端点。lsof 的输出被结构化成了可读表格。

一键操作。 对监听中的 TCP 端口点一下浏览器图标,自动打开 http://localhost:port。再点一下复制按钮,localhost:port 地址进剪贴板。

终止进程。 确认不需要的进程,点终止按钮释放端口。系统进程需要管理员权限。

分页渲染

大量端口(比如 200+ 条)时不会卡顿。表格做了分页渲染,滚动时只绘制可见行。这个在 Flutter 桌面端不多见 — 大部分 demo 项目直接用全量 ListView,端口一多就掉帧。

跨平台支持

同一份代码库跑在 macOS 和 Windows 上。平台差异通过服务层隔离:

1
2
3
4
5
// macOS 用 lsof + ps
// Windows 用 netstat + tasklist + wmic
abstract class PortService {
Future<List<PortInfo>> scanPorts();
}

具体实现各平台一个类,编译时按 dart:ioPlatform 分发。

Release 包在 GitHub Actions 上自动构建。Windows 版本在 CI 的 Windows runner 上编译,macOS 版在本地构建上传。v1.0.0 已提供直接下载的 zip 包。

技术栈

  • Flutter 3.x + Dart 3.12+
  • Material Design 3
  • 平台 channel 调用系统命令行工具
  • GitHub Actions CI/CD

项目结构简洁:

1
2
3
4
5
lib/
├── main.dart # UI
├── models/port_info.dart # 数据模型
└── services/port_service.dart # 平台扫描服务
macos/ windows/ # 平台工程

安装

Releases 页面 下载:

  • macOS: port_manager-macos-v1.0.0.zip,解压后拖入 /Applications
  • Windows: port_manager-windows-v1.0.0.zip,解压后运行

也可以从源码跑:

1
2
flutter pub get
flutter run -d macos # 或 -d windows

局限与边界

  • “浏览器打开”假设端口上跑的是 HTTP 服务,不是 HTTPS
  • Windows 上部分进程详情依赖系统命令可用性
  • 终止系统进程可能需要管理员权限

工具定位是本机开发和排障场景,不是运维监控面板。轻量、即时、零依赖。

GitHub: wlxweb/port_manager · MIT License