2011-09-02 3 views
4

java 프로세스에서 주어진 프로세스 ID를 사용하여 java 프로세스에서 열어 본 포트를 찾을 수있는 방법이 있습니까? 플랫폼 독립적이어야하므로 java를 사용해야합니다.프로세스 ID, java를 사용하여 프로세스에서 사용중인 포트를 찾는 방법이 있습니까?

주어진 프로세스 ID : 해당 프로세스에서 사용중인 모든 포트/소켓 연결을 출력하십시오.

몇 가지 주어진 점 : 동일한 jvm에서 실행중인 프로세스. 해당 프로세스에서 사용하는 포트/소켓이 하나 뿐이며 에 Pid가 제공됩니다.

은 JPS를 시도 ps -au | grep pid | ...

답변

1

같은 플랫폼 특정 명령을 할 수 있습니까? 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 
+0

덕분에 단지 그것을 시도했다. 내가 필요한 것에 아주 가깝다. 그러나 jps는 명시 적으로 설정된 매개 변수 만 표시합니다. 새 ServerSocket (0)을 사용하여 동적으로 열리는 포트가 있습니다. 생성 된 포트가 무엇인지 파악해야합니다. JPS는 거기에서 부족합니다. 도와 주셔서 감사합니다. – Devesh

+0

도움이 되니 기쁩니다. 서버를 작성하셨습니까? 왜 포트 번호가 필요한가요? 그냥 궁금해서 – eon

+0

예. 포트에서 시작하는 서버에 필요합니다. 빈 포트는 새로운 ServerSocket (0)을 사용하여 런타임에 발견되며 나중에 JMX 명령을 처리 (새로 고침, 종료 등) 할 수 있어야합니다. 실제 포트 번호가 필요한 곳입니다. 그 과정은 지금까지 알려져 있습니다. 프로세스 ID가 주어지면 포트 번호를 찾는 방법은 무엇입니까? – Devesh

2

대답은 no입니다. 어떤 프로세스가 어떤 포트를 가지고 있는지는 자바 애플리케이션이 사용할 수있는 정보가 아닙니다. JNI가 필요하고 운영 체제에 따라 다릅니다.

+0

덕분에. – Devesh

+0

런타임에'lsof -i'가 실행되면 어떨까요? – Bohemian

+0

그건 100 % 자바가 아닙니다. 모든 시스템 호출 및/proc 파일입니다. 여기에 Windows가있을 수 있습니다. – bmargulies

1

대답은 운영 체제에 따라 예입니다.

예를 들어 mac osx에서 적절한 명령을 찾으려면 lsof -i을 입력 한 다음 Runtime을 사용하여 출력을 분석하고 출력을 구문 분석하십시오.

여기에 그것을 할 것이 몇 가지 기본적인 코드입니다 :

Process p = Runtime.getRuntime().exec(new String[] { "lsof", "-i" }); 
InputStream commandOutput = p.getInputStream(); 
관련 문제