如题简单粗暴,由于经常被 IDEA 的tomcat端口、或debug端口占用所苦,特找来关闭指定接口的代码进行修改。
用法:修改8080作为第一个端口号,显然i是此后的多少个
ports.add((8080 + i));
全文:
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.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <h3>关闭指定端口号</h3>
* <p>删除端口号</p>
*
* @author : TimVan
* @date : 2020-05-17 22:05
**/
public class KillServer {
private Set<Integer> ports;
Pattern pattern = Pattern.compile("^ *[a-zA-Z]+ +\\S+");
public static void main(String[] args) throws InterruptedException {
Set<Integer> ports = new HashSet<>();
//todo:修改8080作为第一个端口号,显然i是此后的多少个
for (int i = 0; i <= 10; i++) {
ports.add((8080 + i));
}
gossipPortKill(ports);
}
/**
* 清空Gossip端口号
*/
public static void gossipPortKill(Set<Integer> ports) {
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");
}
public void start(int port) {
Runtime runtime = Runtime.getRuntime();
try {
System.out.println("尝试对" + port + "端口清理...");
//查找进程号
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("找不到该端口的进程");
} 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) {
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();
}
}