用Java实现一个查找端口占用并且结束进程的小工具killPort

使用Java调用CMD命令实现。
项目地址:https://gitee.com/shizhangmourenle/kill-process.git

主程序killPort :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * @author zjq
 * @version 1.0
 * @date 2021/1/31 16:52
 */
public class killPort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入要查询的端口号:");
        int port = sc.nextInt();// 要查询的端口号

        killPort killPort = new killPort();
        String pid = killPort.getPID(String.valueOf(port));//获取pid == 135
        System.out.println("端口号为:" + port + "的PID 为:" + pid);
        if (pid==null){
            System.out.println("该端口下没有进程!!!");
            System.exit(0);
        }else {
            String pressName = killPort.getPressName(pid);
            System.out.println("进程名为:" + pressName);
            System.out.println("你要关闭该进程吗???  (0/1)");
            int i = sc.nextInt();
            if (i == 1) {
                System.out.println("准备关闭 " + "pressName" + " 进程!!!");
                killPort.killProcess(pid);
            } else {
                System.exit(0);//退出程序
            }
        }
    }

    /**
     * 结束进程
     */
    public void killProcess(String pid) {
        Runtime runtime = Runtime.getRuntime();
        try {
            //taskkill /pid 10580 -f
            Process tasklist = runtime.exec("taskkill /pid " + pid + " -f");
            System.out.println("进程关闭成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 拿到PID对应的进程名
     * @return
     */
    public String getPressName(String PID) {
        StringUtils stringUtils = new StringUtils();
        Runtime runtime = Runtime.getRuntime();
        String processName = null;
        int index = 0;
        try {
            Process tasklist = runtime.exec("tasklist");
            BufferedReader reader = new BufferedReader(new InputStreamReader(tasklist.getInputStream(), "GBK"));
            String line = null;
            StringBuffer buffer = new StringBuffer();
            while ((line = reader.readLine()) != null) {
                if (index >= 3) {
//                    System.out.println(line);
                    String findpid = stringUtils.findpid(line);
                    if (PID.equals(findpid)) {
                        processName = stringUtils.getProcessName(line);
                    }
                }
                index++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return processName;
    }

    /**
     * 返回端口号对应的PID
     *
     * @param Port
     * @return
     */
    public String getPID(String Port) {
        StringUtils stringUtils = new StringUtils();
        Runtime runtime = Runtime.getRuntime();
        String PID = null;
        try {
            Process findPort = runtime.exec("netstat -ano");
            BufferedReader reader = new BufferedReader(new InputStreamReader(findPort.getInputStream(), "GBK"));
            String line = null;
            StringBuffer buffer = new StringBuffer();
            while ((line = reader.readLine()) != null) {
//                System.out.println(line);
                String ipAndPort = stringUtils.findIPAndPort(line);
                String port = stringUtils.findPort(ipAndPort);
                if (port.equals(Port)) {
                    PID = stringUtils.findPID(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return PID;
    }
}

工具类方法:


/**
 * @author zjq
 * @version 1.0
 * @date 2021/1/31 19:26
 */
public class StringUtils {
    /**
     * 根据PID拿到进程名称
     */
    public String getProcessName(String line) {
        String ss = line;
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < ss.length(); i++) {
            if (ss.charAt(i) != ' ') {
                buffer.append(ss.charAt(i));
            } else {
                break;
            }
        }
        return buffer.toString();
    }

    /**
     * 解析出PID
     */
    public String findpid(String line) {
        String ss = line;
        StringBuffer buffer = new StringBuffer();
        for (int i = 33; i >= 0; i--) {
            if (ss.charAt(i) != ' ') {
                buffer.append(ss.charAt(i));
            } else {
                break;
            }
        }
        return buffer.reverse().toString();
    }

    /**
     * 拿到IP
     */
    public String findIPAndPort(String IP) {
        String ss = IP;
        StringBuffer ip = new StringBuffer();
        for (int i = 9; i < ss.length(); i++) {
            if (ss.charAt(i) != ' ') {
                ip.append(ss.charAt(i));
            } else {
                break;
            }
        }
        return ip.toString();
    }

    /**
     * 拿到PID
     */
    public String findPID(String PID) {
        String ss = PID;
        StringBuffer pid = new StringBuffer();
        for (int i = 71; i < ss.length(); i++) {
            pid.append(ss.charAt(i));
        }
        return pid.toString();
    }

    /**
     * 拿到端口号
     */
    public String findPort(String ipAndPort) {
        String ip = ipAndPort;
        StringBuffer buffer = new StringBuffer();
        for (int i = ip.length() - 1; i >= 0; i--) {
            if (ip.charAt(i) != ':') {
                buffer.append(ip.charAt(i));
            } else {
                break;
            }
        }
        return buffer.reverse().toString();
    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述
使用工具把Jar包变成killPort.exe。就可以在windows上面运行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值