Има ли начин да се намери порт, който се използва от процес, като се има предвид неговия идентификатор на процеса, като се използва 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 показва само изрично зададените параметри. Имам порт, който се отваря динамично с помощта на new ServerSocket(0). Трябва да разберете какъв е портът, който е създаден. JPS не достига там. Благодаря за помощта. - person Devesh; 03.09.2011
comment
радвам се, че помогна, написа ли сървъра? защо ти трябва номера на порта? Просто съм любопитен - person eon; 03.09.2011
comment
да, необходимо е в сървър, който стартира от порт. Свободният порт се открива по време на изпълнение с помощта на new ServerSocket(0) и трябва да може да обработва JMX команди по-късно (опресняване, изключване и т.н.). Тук е необходим истинският номер на порта. Процесът вече е известен. Някакви предложения за намиране на номера на порта, като се има предвид идентификаторът на процеса? - person Devesh; 03.09.2011