클라이언트에서 서버로 두 개의 연결, 클라이언트에서 두 개의 가상 컴퓨터 간의 통신을 위해 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>);
이 문제를 해결하기 위해 더 나은 방법이 있나요 전화를? 두 개의 레지스트리를 만들고 깨끗하게 사용할 수 있습니까? 아니면 클라이언트와 서버가 레지스트리를 공유 할 수 있습니까?
exportObject에서 포트를 0으로 사용하는 이유는 무엇입니까? 레지스트리를 만들 때뿐만 아니라 개체를 내보낼 때 두 개의 다른 포트를 사용하면 좋을 것입니다. –