짧은 이야기 - Windows를 사용하는 별도의 컴퓨터에서 클라이언트와 서버로 RMI 응용 프로그램을 실행하려고합니다.두 대의 컴퓨터에서 Java RMI 응용 프로그램을 실행 중 - ConnectException
서버의 단순화 된 코드는 다음과 같습니다 클라이언트의
System.setProperty("java.rmi.server.hostname", "192.168.x.x");
Registry reg = LocateRegistry.createRegistry(1099);
RemoteFoo foo = new RemoteFoo();
reg.rebind("Foo", foo);
나는이 :
reg = LocateRegistry.getRegistry("192.168.x.x", 1099);
RemoteFooInterface foo = (RemoteFooInterface) reg.lookup("Foo");
내가 얻을 예외는 연결이 호스트 거부 "에 있습니다으로 192.168.xx, 상자의 예외 연결 시간이 초과되었습니다 : 연결 "을 클릭하여 개체를 찾습니다.
비슷한 문제가있는 사람의 StackOverflow에 대한 몇 가지 질문을 읽었습니다. 그 때문에 클라이언트가 사용하지만 여전히 작동하지 않는 스텁에 올바른 IP를 포함시키기 위해 시스템 속성을 변경하는 줄을 추가했습니다.
누군가 내가 시도 할 수있는 것에 대한 조언을 해주면 아주 감사 할 것입니다.
알았습니다. 귀하의 조언에 따라 문제가 발생한 방화벽이 있습니다. 클라이언트가 원격 객체를 그 레지스트리에 바인드하려고 할 때마다 문제가 생깁니다 : reg.rebind (name, RemoteFoo); 레지스트리가 원격 호스트에 있으므로 바인딩되는 이유가 허용되지 않습니다. RMI의 목적이 아닌가? 레지스트리와 동일한 시스템에 있지 않은 응용 프로그램이 레지스트리를 사용할 수 있습니까? 어쨌든, 도와 주셔서 대단히 감사합니다! – PetarMI
네, 개체를 서버의 레지스트리에 바인딩 할 수 있습니다. 당신은 원격 바인드를 할 수 없다. 원격 객체는 서버 시스템/프로세스에서 로컬로 바인딩됩니다. 서버 부분은 로컬 net 인터페이스 (InetAddress.getLocalHost())에 액세스하여 192.168.x.x에서 실행되며 클라이언트는 다른 프로세스 또는 시스템에서 실행됩니다. 다른 VM이나 다른 프로세스에서 객체를 바인딩 할 수 없습니다. 이것은 허용되지 않습니다. 두 가지 다른 프로세스를 사용해야합니다. 서버 쪽 코드는 컴퓨터 192.168.x.x에서 실행되어야하며 클라이언트는 네트워크 내에서 (로컬 또는 원격) 어디서나 실행할 수 있지만 diff 프로세스로 수행하십시오 –
좋은 설명에 감사드립니다! 매우 감사. – PetarMI