2012-01-18 3 views
4

작동하는 RMI 클라이언트 - 서버 시스템이 있습니다. 서버의 호스트 정보는 클라이언트에게 알려 지므로 클라이언트가 검색하여 전화를 걸 수 있습니다. 서버에 대한 첫 번째 호출에서 클라이언트는 서버가 콜백을 수행 할 수 있도록 "자체"에 대한 원격 참조를 서버에 전달합니다. 서버는 연결된 모든 클라이언트의 목록을 유지 관리합니다 (클라이언트가 서버에서 "등록 취소"할 때 해당 클라이언트를 종료하고 클라이언트가 도달 할 수 있는지 여부를 주기적으로 검사하고 그렇지 않은 스레드를 제거하는 스레드가 있음).RMI : 원격 객체의 IP 주소를 결정하십시오.

서버에 그래픽 인터페이스 (웹 응용 프로그램의 일부)가있어 사용자가 언제든지 연결된 클라이언트를 시각화 할 수 있습니다. 이제이 인터페이스에 클라이언트의 IP 주소를 표시하라는 메시지가 표시됩니다.

내 질문 : RMI에서 원격 객체 (스텁)에 대한 원격 참조가있는 경우이 원격 객체가 실제로 존재하는 호스트 (DNS 이름 또는 IP 주소)를 확인하는 간단한 방법이 있습니까?

참고 : 클라이언트가 먼저 정보를 연결하고 저장할 때 RemoteServer.getClientHost을 사용할 수 있습니다. 또는 호스트 정보를 반환하는 클라이언트에서 원격 메소드를 구현할 수 있지만 기본 제공 RMI 방법이 있는지 알고 싶습니다. 원격 참조로 그것을하는 것.

+0

질문이 명확하지 않습니다. RemoteServer.getClientHost()는 원격 객체의 주소가 아니라 클라이언트의 주소를 제공합니다. 그리고 어쨌든 원격 객체의 주소는 무엇입니까? RMI에서 할 수있는 일은 아무것도 없다. – EJP

+0

예,이 경우 원격 객체의 주소가 필요합니다. RMI 호출이나 그와 같은 것, GUI에 표시하기위한 것은 아닙니다 ... –

답변

1

RMISecurityManager와 UnicastRemoteObject는 그것에 대해 아무 말도하지 않습니다.
클라이언트가 연결될 때 RemoteServer.getClientHost을 사용할 수 있습니다.
원격 메서드 호출에 전달되지 않으면이 정보를 얻을 수 없다고 생각합니다.

+0

나는 같은 결론에 도달했습니다. 클라이언트가 연결할 때 RemoteServer.getClientHost를 사용하여 다른 곳에 사용될 정보를 저장합니다. –

+1

'RemoteServer.getClientHost()'는 당신에게 원격 객체의 IP 주소를주지 않습니다. 현재의 원격 객체의 * 클라이언트 *의 IP 주소를 제공합니다. – EJP

-1

참고 : 주석은 사용하지 마십시오.

GUI의 클라이언트 IP 주소를 표시하는 것과 동일한 요구 사항이 있습니다. 디버깅 원격 객체 및 부 객체의 유형을 분석 한 결과, 다음 코드 내놓았다

NotExpectedTypeException
public static String getIpAddress(Object proxy) throws IllegalArgumentException, RemoteException, NotExpectedTypeException 
    { 
    InvocationHandler h = Proxy.getInvocationHandler(proxy); 
    if (h instanceof RemoteObjectInvocationHandler) 
    { 
     RemoteRef remoteRef = ((RemoteObjectInvocationHandler) h).getRef(); 
     if (remoteRef instanceof UnicastRef) 
     { 
     Endpoint ep = ((UnicastRef) remoteRef).getLiveRef().getChannel().getEndpoint(); 
     if (ep instanceof TCPEndpoint) { return ((TCPEndpoint) ep).getHost(); } 
     throw new NotExpectedTypeException(ep.getClass().getSimpleName(), "TCPEndpoint"); 
     } 
     throw new NotExpectedTypeException(remoteRef.getClass().getSimpleName(), "UnicastRef"); 
    } 
    throw new NotExpectedTypeException(h.getClass().getSimpleName(), "RemoteObjectInvocationHandler"); 
    } 

는 자체 정의 예외이다.

instanceof이 많이 포함되어 있기 때문에 방법의 신뢰성이 확실하지 않습니다. 그러나 TCP 연결을 사용하는 LAN에서 성공적으로 테스트했습니다.

+0

당신이 명시 적으로 경고하는'sun. *'클래스에 완전히 의존하고 완전히 무의미합니다. 'RemoteServer.getClientHost()'만 있으면됩니다. – EJP

+0

지적 해 주셔서 감사합니다. 답을 추가하기 전에 받아 들인 대답을 보았지만'RemoteServer.getClientHost()'의 개념을 이해할 수 없었습니다. 주로 정적 메서드이기 때문에. 하지만 Javadoc에 명시된 바와 같이 현재 스레드에서 원격 객체의 IP 주소를 제공한다는 것을 알았습니다. 예 : 제 경우에는 단지'getIpAddress()'를'RemoteServer.getClientHost()'로 대체 할 필요가있었습니다. – gillesB

관련 문제