2014-12-27 2 views
1

짧은 이야기 - 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를 포함시키기 위해 시스템 속성을 변경하는 줄을 추가했습니다.
누군가 내가 시도 할 수있는 것에 대한 조언을 해주면 아주 감사 할 것입니다.

답변

2

서버의 방화벽이 액세스를 차단할 수 있습니다.

당신이 당신의 클라이언트 시스템 오픈 명령 프롬프트 cmd.exe에서, 귀하의 경우, 예를 들어 1099 년, 포트에 연결 telnet 192.168.x.x 1099 (이 서버에 1099 포트에 연결됩니다) 입력 할 수 있는지 확인합니다. '연결 대상'이라고 말하면 해당 포트를 사용할 수 없으며 클라이언트 컴퓨터가 서버에 연결할 수 없을 가능성이 큽니다. ping 192.168.x.x를 시도하십시오 (ICMP가 서버의 방화벽에서 허용되는 경우 작동합니다).

방화벽을 수정하여 포트 1099를 통한 연결을 허용하거나 (일시적으로) 사용하지 않도록 설정하고 다시 시도하십시오. 일단 지워지면 RMI 클라이언트를 실행하십시오.

+0

알았습니다. 귀하의 조언에 따라 문제가 발생한 방화벽이 있습니다. 클라이언트가 원격 객체를 그 레지스트리에 바인드하려고 할 때마다 문제가 생깁니다 : reg.rebind (name, RemoteFoo); 레지스트리가 원격 호스트에 있으므로 바인딩되는 이유가 허용되지 않습니다. RMI의 목적이 아닌가? 레지스트리와 동일한 시스템에 있지 않은 응용 프로그램이 레지스트리를 사용할 수 있습니까? 어쨌든, 도와 주셔서 대단히 감사합니다! – PetarMI

+1

네, 개체를 서버의 레지스트리에 바인딩 할 수 있습니다. 당신은 원격 바인드를 할 수 없다. 원격 객체는 서버 시스템/프로세스에서 로컬로 바인딩됩니다. 서버 부분은 로컬 net 인터페이스 (InetAddress.getLocalHost())에 액세스하여 192.168.x.x에서 실행되며 클라이언트는 다른 프로세스 또는 시스템에서 실행됩니다. 다른 VM이나 다른 프로세스에서 객체를 바인딩 할 수 없습니다. 이것은 허용되지 않습니다. 두 가지 다른 프로세스를 사용해야합니다. 서버 쪽 코드는 컴퓨터 192.168.x.x에서 실행되어야하며 클라이언트는 네트워크 내에서 (로컬 또는 원격) 어디서나 실행할 수 있지만 diff 프로세스로 수행하십시오 –

+0

좋은 설명에 감사드립니다! 매우 감사. – PetarMI

관련 문제