使用java代码关闭指定端口的程序-windows
转载请请在页首注明作者与出处
一:问题由史
今天遇到一个问题,就是在实现自动化灾备的时候,发现原有死掉的程序没有完全关闭,当然这都不是本文的重点,重点是这个时候,我得把它完全关闭,所以才有了这篇文章。
二:基础知识
2.1:java要怎么实现
java可以获取并删除JAVA虚拟机启动的应用,但是却并没有提供API获取操作系统中其它的进程的API。
但是java可以执行操作系统的脚本命令。
2.2:根据端口查找进程
windows中有这样的命令
netstat -ano 查看操作系统所有占用端口的进程
netstat -ano | findstr "" 获取占用了80端口的进程
得到的结果如下
TCP 127.0.0.1: 127.0.0.1: TIME_WAIT
TCP 127.0.0.1: 127.0.0.1: TIME_WAIT
UDP 0.0.0.0: *:*
UDP 0.0.0.0: *:*
可以看到TCP/UPD是所使用的协议,后面的是绑定IP与端口,最后一列,是占用的进程号(pid)。
2.3:根据进程号删除进程
再来看一条命令
taskkill /pid
我们可以关闭进程号为123的进程,当然,我试上面的这条命令的时候,系统提示无法终止这个进程,那我们可以加一个/F,如下,就能强行关闭。
taskkill /F /pid
三:java实现,支持一次性杀死多个端口
之前有说过,java可以执行操作系统的脚本,不论是什么操作,系统,那么我们就可以用这个方法,来直接执行这些命令来达到相应的效果。
package kill.window; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class KillServer {
private Set<Integer> ports; public static void main(String[] args) throws InterruptedException {
System.out.println("请输入要杀掉的windows进程的端口号,如果有多个,则以逗号相隔");
System.out.println("Please input kill port");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
scanner.close();
String[] split = input.split(",");
Set<Integer> ports = new HashSet<>();
for (String spid : split) {
try{
int pid = Integer.parseInt(spid);
ports.add(pid);
}catch(Exception e){
System.out.println("错误的端口号,请输入一个或者多个端口,以英文逗号隔开");
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.exit(0);
}
} KillServer kill = new KillServer();
kill.ports = ports;
System.out.println("need kill " + ports.size() + " num");
for (Integer pid : ports) {
kill.start(pid);
}
System.out.println("清理完毕,程序即将退出");
System.out.println("SUCCESS");
Thread.sleep(5000);
System.exit(0); } public void start(int port){
Runtime runtime = Runtime.getRuntime();
try {
//查找进程号
Process p = runtime.exec("cmd /c netstat -ano | findstr \""+port+"\"");
InputStream inputStream = p.getInputStream();
List<String> read = read(inputStream, "UTF-8");
if(read.size() == 0){
System.out.println("找不到该端口的进程");
try {
Thread.sleep(6000);
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
for (String string : read) {
System.out.println(string);
}
System.out.println("找到"+read.size()+"个进程,正在准备清理");
kill(read);
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 验证此行是否为指定的端口,因为 findstr命令会是把包含的找出来,例如查找80端口,但是会把8099查找出来
* @param str
* @return
*/
private boolean validPort(String str){
Pattern pattern = Pattern.compile("^ *[a-zA-Z]+ +\\S+");
Matcher matcher = pattern.matcher(str); matcher.find();
String find = matcher.group();
int spstart = find.lastIndexOf(":");
find = find.substring(spstart + 1); int port = 0;
try {
port = Integer.parseInt(find);
} catch (NumberFormatException e) {
System.out.println("查找到错误的端口:" + find);
return false;
}
if(this.ports.contains(port)){
return true;
}else{
return false;
}
} /**
* 更换为一个Set,去掉重复的pid值
* @param data
*/
public void kill(List<String> data){
Set<Integer> pids = new HashSet<>();
for (String line : data) {
int offset = line.lastIndexOf(" ");
String spid = line.substring(offset);
spid = spid.replaceAll(" ", "");
int pid = 0;
try {
pid = Integer.parseInt(spid);
} catch (NumberFormatException e) {
System.out.println("获取的进程号错误:" + spid);
}
pids.add(pid);
}
killWithPid(pids);
} /**
* 一次性杀除所有的端口
* @param pids
*/
public void killWithPid(Set<Integer> pids){
for (Integer pid : pids) {
try {
Process process = Runtime.getRuntime().exec("taskkill /F /pid "+pid+"");
InputStream inputStream = process.getInputStream();
String txt = readTxt(inputStream, "GBK");
System.out.println(txt);
} catch (IOException e) {
e.printStackTrace();
}
}
} private List<String> read(InputStream in,String charset) throws IOException{
List<String> data = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));
String line;
while((line = reader.readLine()) != null){
boolean validPort = validPort(line);
if(validPort){
data.add(line);
}
}
reader.close();
return data;
}
public String readTxt(InputStream in,String charset) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));
StringBuffer sb = new StringBuffer();
String line;
while((line = reader.readLine()) != null){
sb.append(line);
}
reader.close();
return sb.toString();
}
}
使用java代码关闭指定端口的程序-windows的更多相关文章
- 如何用dat批处理文件关闭某端口对应程序-Windows自动化命令
如何用dat批处理文件关闭某端口对应程序? 网上找到的大部分都是手动操作,第一步先查出端口,第二步在根据上一步查到的端口手动去关闭进程.但我的需求不是这样的,我需要全自动处理.用于 dubbo 服务进 ...
- windows下关闭指定端口服务,解决tomcat端口占用问题
http://blog.aizhet.com/Server/640.html 在windows下做java EE的开发时:搭建 Eclipse+tomcat的java web开发环境:在应用之中经常遇 ...
- java 启动jar 指定端口
java 启动jar 指定端口 java -jar xxx.jar --server.port=80
- java代码关闭tomcat程序
1.通过java代码实现tomcat的关闭 2.tomcatStop.java package test; import java.io.BufferedReader; import java.io. ...
- Windows 查看并关闭占用指定端口的程序
windows关闭端口的小工具: 链接:https://pan.baidu.com/s/1ZGL4cdSluy0lbi3tDERUvA 提取码:spxy 查看指定端口的使用情况 netstat -an ...
- Java如何在指定端口创建套接字?
在Java编程中,如何在指定端口创建套接字并连接到指定服务器的端口? 下面的例子演示了Socket类的Socket构造函数,并且使用getLocalPort(),getLocalAddress(),g ...
- java socket 网络通信 指定端口的监听 多线程 乱码
Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...
- 统计文件夹下java代码行数的小程序--主要是学习任务队列的思想
首先感谢czbk的老师,录制的视频,让我们有这么好的学习资料.……—— 统计文件夹java文件的行数,首先想到的肯定是用递归的方法,因为文件夹下面可能包含文件夹,用递归的方法,代码容易写.(这和写简单 ...
- windows 10中使用命令行关掉占用指定端口的程序
通过netstat -ano与findstr命令结合查询到带有9080端口的监听信息,图中最后一列为监听程序的PID 通过tasklist命令与findstr命令结合查询到指定PID对应的应用程序 使 ...
随机推荐
- VisualVM通过jstatd方式远程监控远程主机
配置好权限文件 [root@test bin]# cd $JAVA_HOME/bin [root@test bin]# vim jstatd.all.policy grant codebase &qu ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- Visaul Studio 常用快捷键的动画演示
从本篇文章开始,我将会陆续介绍提高 VS 开发效率的文章,欢迎大家补充~ 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以 ...
- In-Memory:内存优化表 DMV
在内存优化表的DMV中,有两个对象ID(Object ID): xtp_object_id 是内部的内存优化表(Internal Memory-Optimized Table)的ID,在对象的整个生命 ...
- 我为NET狂官方面试题-数据库篇
求结果:select "1"? 查找包含"objs"的表?查找包含"o"的数据库? 求今天距离2002年有多少年,多少天? 请用一句SQL获 ...
- 【Win 10 应用开发】应用预启动
所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- (资源整理)带你入门Spark
一.Spark简介: 以下是百度百科对Spark的介绍: Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方 ...
- SQL-union
集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定.(可以用来连接多个结果)联合(union)与连接(jo ...
- angularjs 1 开发简单案例(包含common.js,service.js,controller.js,page)
common.js var app = angular.module('app', ['ngFileUpload']) .factory('SV_Common', function ($http) { ...