注册

我写了一个程序,让端口占用无路可逃

作为一个 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();
}
}

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


image.png


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


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


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


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


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


image.png


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


image.png


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


20240630_104641.gif


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


最后的最后,再臭不要脸的给自己要个赞,觉得不错的可以去 GitHub 仓库上下载下来看看,如果能点个 star 更是万分感谢,这里再贴一下仓库地址:windows-process


image.png


作者:烽火戏诸诸诸侯
来源:juejin.cn/post/7385499574881026089

0 个评论

要回复文章请先登录注册