⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7385499574881026089 「烽火戏诸诸诸侯」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

作为一个 Java 工程师,经常会遇到这么个场景:IDEA 里的程序正在运行,此时直接关闭了 IDEA 而没有先关闭正在运行的服务。

在绝大多数情境下,此方式都无伤大雅,但总有一些抽风的场景运行的程序并没有被正常的关闭,也就导致了重启项目时将会提示 xxxx 端口已被占用。

在 Windows 下此方式解决也十分简单,在命令行输入下述两个命令即可根据端口关闭对应的进程。

# 端口占用进程
netstat -ano | findstr <port>

# 进程关闭
taskkill -PID <pid> -F

虽然说也不麻烦但却很繁杂,试想一下当遇到这种情况下,我需要先翻笔记找出这两个命令,在打开命令行窗口执行,一套连招下来相当影响编程情绪。

因此,我决定写一个程序能够便捷的实现这个操作,最好是带 GUI 页面。

说干就干,整个程序功能其实并不复杂,对于页面的展示要求也不高,我就确定下来了直接通过 Java Swing 实现 GUI 部分。而对于命令执行部分,在 Java 中提供了 Process 类可用于执行命令。

先让我们看下 Process 的作用方式,以最简单的 ping baidu.com 测试为例。

public void demo() {  
ProcessBuilder processBuilder = new ProcessBuilder();
List<String> command = new ArrayList<>();
command.add("ping");
command.add("www.baidu.com");
processBuilder.command(command);

try {
Process process = processBuilder.start();
try (
InputStreamReader ir = new InputStreamReader(process.getInputStream(), "GBK");
BufferedReader br = new BufferedReader(ir)
) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

运行上述的代码,在控制台可以得到下图结果:

在上述程序中,ProcessBuilder 用于构建命令,processBuilder.start() 则相当于你敲下回车执行,而执行的结果的则以 IO 流的形式返回,这里通过 readLine() 将返回的结果逐行的形式进行读取。

了解的大概原理之后,剩下的事情就简单了,只需要将之前提到的两个命令以同样的方式通过 Process 执行就可以,再通过 Java Swing 进行一个页面展示就可以。

具体的实现并不复杂,这里就不详细展开介绍,完整的项目代码已经上传到 GitHub,感兴趣的小伙伴可自行前往查看,仓库地址:

https://github.com/great-jin/windows-process

下面主要介绍程序的使用与效果,开始前可以去上述提到的仓库 relase 里将打包完成的 exe 程序下载。

下载后启动 window process.exe 程序,在启动之后会先弹出下图的提示,这是因为使用了 exe4j 打包程序,选择确认即可。

选择确认之后即会展示下图页面,列表中展示的数据即 netstat -ano 命令返回的结果,

在选中列表任意一条进程记录后,会将该进程对应的端口号和 PID 填充至上面的输入框中。

同时,可在 Port 输入框中输入对应的端口号实现快速查询,若需要停止某个进程,则将点击对应端口进程记录其 PID 会自动填入输入框中,然后单击 Kill 按钮,成功停止进程后将会进行相应的提示。

文章目录