Есть ли способ найти порт, используемый процессом, с учетом его идентификатора процесса, используя java?

Есть ли способ найти порт, открытый java-процессом, с учетом идентификатора процесса в java? Нужно найти его с помощью java, так как он должен быть независимым от платформы.

Учитывая идентификатор процесса: вывод любых портов/сокетов, используемых этим процессом.

Немногое дано: процесс работает в том же jvm. Этот процесс использует только 1 порт/сокет, для которого задан PID.

Невозможно выполнять специфичные для платформы команды, такие как ps -au | grep pid | ...


person Devesh    schedule 02.09.2011    source источник


Ответы (3)


Ответ - нет. Какие процессы имеют какие порты — это вообще недоступная для java-приложений информация. Вам понадобится JNI, и это будет зависеть от операционной системы.

person bmargulies    schedule 03.09.2011
comment
Как насчет lsof -i, выполняемого во время выполнения? - person Bohemian♦; 03.09.2011
comment
Это не 100% Java. Это все системные вызовы и файлы /proc — и здесь мы можем быть в Windows. - person bmargulies; 03.09.2011

Ответ положительный, в зависимости от вашей операционной системы.

Вам нужно найти соответствующую команду, например, на mac osx, это lsof -i, затем использовать Runtime для ее выполнения и анализа вывода.

Вот некоторый базовый код, который сделает это:

 Process p = Runtime.getRuntime().exec(new String[] { "lsof", "-i" });
 InputStream commandOutput = p.getInputStream();
person Bohemian♦    schedule 03.09.2011
comment
Знаете ли вы какую-нибудь утилиту, которая охватывает всю сложность кроссплатформенности с помощью красивого API? - person oligofren; 01.06.2021
comment
@TheNimbleSurfer нет, но в основном есть только 2 разновидности ОС, поэтому вы можете определить ОС, затем использовать либо lsof, либо эквивалент Windows - person Bohemian♦; 02.06.2021

Вы пробовали jps? См. http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html

Будет ли полезно, если вы поместите номер порта в имя текущего потока, тогда вы сможете извлечь номер порта из имени потока? например

import java.net.ServerSocket;

public class SocketDriver { 
    public static void main(String[] args) throws Exception {       
        ServerSocket serverSocket = new ServerSocket(0);
        int localPort = serverSocket.getLocalPort();

        String threadName = Thread.currentThread().getName(); 
        Thread.currentThread().setName(threadName + ":" + localPort);
        System.out.println("port -> " + localPort);
        System.out.println("thread -> " + Thread.currentThread().getName());
        serverSocket.close();
    }
}

Выход:

port -> 51958
thread -> main:51958
person eon    schedule 02.09.2011
comment
спасибо только что попробовал. очень близко к тому, что мне нужно. но jps показывает только явно заданные параметры. У меня есть порт, динамически открываемый с помощью нового ServerSocket(0). Нужно выяснить, какой порт был создан. JPS здесь отстает. Спасибо за помощь. - person Devesh; 03.09.2011
comment
рад, что это помогло, вы написали сервер? зачем вам номер порта? просто любопытно - person eon; 03.09.2011
comment
да, это необходимо на сервере, который запускается на порту. Свободный порт обнаруживается во время выполнения с использованием нового ServerSocket (0), и он должен иметь возможность обрабатывать команды JMX позже (обновление, завершение работы и т. д.). Здесь нужен настоящий номер порта. Процесс уже известен. Любые предложения по поиску номера порта с учетом идентификатора процесса? - person Devesh; 03.09.2011