查看Java占用的端口
在开发和运维过程中,我们经常需要查看Java应用程序所占用的端口。这对于排查问题、调试和监控都非常重要。本文将介绍几种方法来查看Java占用的端口,并提供相应的代码示例。
方法一:使用jps
命令
jps
命令是Java开发工具包(JDK)自带的一个命令行工具,用于查看Java进程的相关信息,包括进程ID和进程名。我们可以结合jps
命令和netstat
命令来查看Java占用的端口。
以下是通过jps
和netstat
命令的代码示例:
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