2011-09-21 2 views
3

클라이언트에서 서버로 두 개의 연결, 클라이언트에서 두 개의 가상 컴퓨터 간의 통신을 위해 onether를 사용하는 프로그램에서 작업하고 있습니다.여러 호스트가있는 RMI

RMI 레지스트리가 서버에서 실행되어야하는 것 같습니다 (그렇지 않으면 java.rmi.AccessException: Registry.Registry.rebind disallowed; origin <client ip> is non-local host이됩니다). 또한 클라이언트가 먼저 System.setProperty("java.rmi.server.hostname", <server ip>);을 호출하지 않으면 서버에 연결할 수 없습니다.

그래서 서버와 클라이언트 모두에서 레지스트리를 만들려고했습니다. 클라이언트의 한 가상 컴퓨터에서 다른 가상 컴퓨터로의 통신은 클라이언트에서 생성 된 두 번째 레지스트리를 사용하여 수행됩니다. 이 두 번째 레지스트리는 불만없이 작성됩니다. 그러나 이전에 java.rmi.server.hostname 속성을 설정했기 때문에 또 다른 예외가 발생합니다 : java.rmi.ConnectException: Connection refused to host: <server ip>.

나는 더러운 해결책을 가지고 있습니다. 클라이언트 레지스트리에 대한 모든 Registry.rebind() 대신에, 나는

System.setProperty("java.rmi.server.hostname", "localhost"); 
Registry registry = LocateRegistry. 
Remote stub = (Remote) UnicastRemoteObject.exportObject(remote, 0); 
registry.rebind(name, stub); 
System.setProperty("java.rmi.server.hostname", <server ip>); 

이 문제를 해결하기 위해 더 나은 방법이 있나요 전화를? 두 개의 레지스트리를 만들고 깨끗하게 사용할 수 있습니까? 아니면 클라이언트와 서버가 레지스트리를 공유 할 수 있습니까?

+0

exportObject에서 포트를 0으로 사용하는 이유는 무엇입니까? 레지스트리를 만들 때뿐만 아니라 개체를 내보낼 때 두 개의 다른 포트를 사용하면 좋을 것입니다. –

답변

1

hostname은 로컬로 바인드 된 레지스트리 객체에 대한 응용 프로그램의 호스트 이름을 정의하므로 클라이언트에 System.setProperty("java.rmi.server.hostname", <server ip>);을 작성할 필요가 없습니다. 여기를 참조하십시오 : java.rmi Properties

다른 포트에서도 레지스트리를 실행할 필요가 없습니다. 간단하게 유지하십시오. 불분명 한 점이 있으면 다시 질문 할 수 있습니다.