0
点赞
收藏
分享

微信扫一扫

解决查看java占用的端口的具体操作步骤

NicoalsNC 2023-07-13 阅读 76

查看Java占用的端口

在开发和运维过程中,我们经常需要查看Java应用程序所占用的端口。这对于排查问题、调试和监控都非常重要。本文将介绍几种方法来查看Java占用的端口,并提供相应的代码示例。

方法一:使用jps命令

jps命令是Java开发工具包(JDK)自带的一个命令行工具,用于查看Java进程的相关信息,包括进程ID和进程名。我们可以结合jps命令和netstat命令来查看Java占用的端口。

以下是通过jpsnetstat命令的代码示例:

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

public class JavaPortChecker {
    public static void main(String[] args) throws IOException {
        String javaProcessId = null;

        // 获取Java进程ID
        Process process = Runtime.getRuntime().exec("jps -l");
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            if (line.contains("YourJavaApplication")) {
                String[] parts = line.split(" ");
                javaProcessId = parts[0];
                break;
            }
        }

        if (javaProcessId != null) {
            // 获取Java进程使用的端口
            process = Runtime.getRuntime().exec("netstat -ano | findstr " + javaProcessId);
            reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            System.out.println("Java进程ID:" + javaProcessId);
            System.out.println("占用的端口:");
            while ((line = reader.readLine()) != null) {
                if (line.contains("LISTENING")) {
                    String[] parts = line.trim().split("\\s+");
                    String port = parts[1].split(":")[1];
                    System.out.println(port);
                }
            }
        } else {
            System.out.println("未找到Java进程");
        }
    }
}

运行以上代码,将会输出Java进程的ID以及占用的端口。

方法二:使用Java Management Extensions(JMX)

Java Management Extensions(JMX)是Java平台的一个管理和监控框架。我们可以通过JMX来获取Java进程的相关信息,包括占用的端口。

以下是通过JMX的代码示例:

import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class JavaPortChecker {
    public static void main(String[] args) throws Exception {
        // 创建本地MBeanServer
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

        // 创建RMI注册表并绑定MBeanServer
        Registry registry = LocateRegistry.createRegistry(1099);
        InetAddress address = InetAddress.getLocalHost();
        String host = address.getHostAddress();
        String jmxUrl = "service:jmx:rmi://" + host + "/jndi/rmi://" + host + ":1099/jmxrmi";
        System.setProperty("java.rmi.server.hostname", host);
        System.setProperty("com.sun.management.jmxremote.rmi.port", "1099");

        // 创建一个ObjectName来标识MBean
        ObjectName name = new ObjectName("java.lang:type=Runtime");

        // 获取Java进程使用的端口
        String port = mbs.getAttribute(name, "ManagementSpecVersion").toString();
        System.out.println("占用的端口:" + port);

        // 注销MBeanServer
        mbs.unregisterMBean(name);
    }
}

运行以上代码,将会输出Java进程占用的端口。

方法三:使用第三方库

除了上述两种方法,还可以使用一些第三方库来获取Java进程的相关信息。例如,JavaSysMon是一个Java库,提供了查询操作系统和Java进程信息的功能。

以下是使用JavaSysMon库的代码示例:

import com.jezhumble.javasysmon.JavaSysMon;
import com.jezhumble.javasysmon.ProcessInfo;

public class JavaPortChecker {
    public static void main(String[] args) {
        JavaSysMon javaSysMon = new JavaSysMon();

        // 获取Java进程信息
        ProcessInfo[] processInfos = javaSysMon.processTable();
        for (ProcessInfo processInfo : processInfos) {
            if (processInfo.getCommand().contains("YourJavaApplication")) {
                System.out.println("Java进程ID:" + processInfo.getPid());
                System.out.println("占用的端口:" + processInfo.getListeningPorts
举报

相关推荐

0 条评论