在日常的软件开发和学习过程中,“端口被占用” 是我们经常遇到的头疼问题。每次遇到这种情况,我们都需要在命令行中执行一系列操作:先用netstat -ano | findstr <port>找到占用端口的进程,再用taskkill -PID <pid> -F强制关闭进程。这套操作虽然不复杂,但反复执行时却显得十分繁琐,严重影响开发效率和心情。

为了解决这个痛点,我开发了一款 Windows 端口管理工具,通过图形化界面实现端口的可视化管理,让端口查看和释放变得简单高效。

在这里插入图片描述

在这里插入图片描述

技术选型考量

在开发之初,我面临着技术栈的选择:是使用熟悉的 Java 语言,还是选择更轻量高效的 Python?

经过权衡,我最终选择了 Python,主要基于以下几点考虑:

  1. 开发效率:Python 语法简洁,开发速度快,对于这类系统工具类应用可以快速迭代

  2. 生态优势:Python 拥有丰富的系统交互库,尤其是psutil库能非常方便地获取系统进程和网络连接信息

  3. GUI 实现简单:内置的 Tkinter 库可以快速构建图形界面,无需额外安装重量级 GUI 框架

  4. 部署方便:可以通过 PyInstaller 等工具轻松打包为单个可执行文件,方便用户使用

工具功能特性

这款端口管理工具具备以下核心功能:

  • 实时端口监控:动态显示系统所有 TCP/UDP 端口的占用状态

  • 智能搜索过滤:根据协议、IP、端口号、状态、PID 和进程名快速定位特定端口

  • 常用端口高亮:自动识别并高亮显示常见服务端口(如 Web、数据库、远程连接等)

  • 进程信息详情:双击端口项可查看占用该端口的进程完整信息

  • 安全端口释放:一键终止占用指定端口的进程(支持批量操作)

  • 快捷刷新机制:通过 F5 快捷键或刷新按钮实时更新端口数据

  • 进程聚合视图:支持按进程名称或 PID 聚合显示端口信息

  • 简洁用户界面:采用现代化设计,操作直观,响应迅速

核心技术实现

工具的核心实现基于 Python 的两个关键库:psutil用于获取系统信息,tkinter用于构建图形界面。

项目结构

├── main.py            # 主入口文件
├── theme.py           # 主题和样式设置
├── utils.py           # 工具函数,如端口数据加载
├── ui_components.py   # UI组件,如菜单、工具栏、表格等
├── features.py        # 功能实现,如进程详情、进程终止等
├── requirements.txt   # 项目依赖
└── README.md          # 项目说明

关键代码解析

主程序入口实现了应用的初始化和界面搭建:

class PortViewerApp:
    """Windows端口查看器应用程序"""
    def __init__(self, root):
        self.root = root
        self.root.title("Windows端口查看器")
        self.root.geometry("1000x600")
        self.root.minsize(800, 450)
        
        # 初始化主题和界面组件
        self.theme = Theme()
        self.setup_styles()
        
        # 常用端口列表
        self.common_ports = {
            # 基础网络服务端口
            21, 22, 23, 25, 53, 80, 110, 143, 443,
            # 数据库服务端口
            3306, 5432, 1521, 1433, 27017, 6379,
            # Web服务和应用服务器端口
            8080, 8081, 8000, 8443, 3000, 5000, 9000,
            # 其他常用开发工具和服务端口
            5900, 3389, 9200, 9092, 5672, 2181
        }
        
        # 创建UI组件
        create_menu(self)
        create_toolbar(self)
        create_search_frame(self)
        create_status_bar(self)
        create_table(self)
        
        # 加载端口数据
        self.refresh_data()

端口数据加载和展示是核心功能之一,通过 psutil 库实现:

def load_ports_data(app):
    """加载端口数据并显示在表格中"""
    # 清空表格
    for item in app.tree.get_children():
        app.tree.delete(item)
    
    # 统计信息初始化
    tcp_count = 0
    udp_count = 0
    processes = set()
    
    try:
        # 获取所有网络连接
        connections = psutil.net_connections()
        
        for conn in connections:
            # 过滤掉状态为None且没有远程地址的连接
            if conn.status is None and not conn.raddr:
                continue
                
            # 提取连接信息
            protocol = "TCP" if conn.type == socket.SOCK_STREAM else "UDP"
            local_addr = f"{conn.laddr.ip}:{conn.laddr.port}" if conn.laddr else ""
            remote_addr = f"{conn.raddr.ip}:{conn.raddr.port}" if conn.raddr else ""
            status = conn.status if conn.status else ""
            pid = conn.pid
            
            # 获取进程名称
            process_name = "未知进程"
            if pid:
                try:
                    process = psutil.Process(pid)
                    process_name = process.name()
                    processes.add(pid)
                except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                    pass
            
            # 增加协议计数
            if protocol == "TCP":
                tcp_count += 1
            else:
                udp_count += 1
            
            # 插入表格
            item = app.tree.insert("", "end", values=(
                protocol,
                local_addr.split(':')[0],  # 本地IP
                local_addr.split(':')[1] if ':' in local_addr else "",  # 本地端口
                remote_addr,
                status,
                pid,
                process_name
            ))
            
            # 高亮常用端口
            try:
                port_num = int(local_addr.split(':')[1]) if ':' in local_addr else 0
                if port_num in app.common_ports:
                    app.tree.item(item, tags=("highlight",))
            except ValueError:
                pass
        
        # 更新状态栏统计信息
        app.port_count_var.set(f"端口数量: {tcp_count + udp_count}")
        app.active_processes_var.set(f"进程数: {len(processes)}")
        app.tcp_connections_var.set(f"TCP: {tcp_count}")
        app.udp_connections_var.set(f"UDP: {udp_count}")
        app.status_var.set("就绪")
        
    except Exception as e:
        app.status_var.set(f"加载数据出错: {str(e)}")

AI 助力开发

在开发过程中,AI 工具起到了很大的辅助作用:

  1. 快速生成基础代码框架,减少重复劳动

  2. 提供 UI 设计建议,帮助优化界面布局

  3. 解决特定技术难题,如进程权限处理、端口信息解析等

  4. 自动生成文档和注释,提高代码可维护性

借助 AI 的加持,原本需要数天的开发工作,短短一天内就完成了核心功能的实现和初步优化。

工具获取与使用

源码地址

项目开源在 GitCode,欢迎大家 star 和 fork:https://gitcode.com/Li_Ya_Fei/KPort

下载使用

对于不想编译源码的用户,可以直接下载打包好的可执行文件: https://pan.baidu.com/s/1Rn0PHt1zzNt01ddKgVZntA?pwd=kqv9

使用说明

  1. 直接运行程序即可查看所有端口占用情况

  2. 在搜索框中输入关键词可快速筛选端口

  3. 双击端口项查看进程详情

  4. 选中端口项后点击 “终止进程” 按钮可释放端口

  5. 使用 F5 键可快速刷新端口信息

结语

这款端口管理工具虽然简单,但却能实实在在地解决开发中的一个痛点问题。通过图形化界面,我们将原本需要记忆和输入命令的操作,简化为直观的点击和筛选,极大地提升了工作效率。

未来,我还计划增加端口占用历史记录、端口列表导出等功能,让工具更加完善。如果你有任何建议或问题,欢迎在 GitCode 上提交 issue 或 pull request。

希望这款小工具能为大家的开发工作带来便利!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐