2012-10-08 3 views
1

저는 몇 시간 동안 RMI 문제로 고심하고 있습니다. 지금은 꽤 바보 같은 예제입니다. 클라이언트가 동일한 컴퓨터에 클라이언트 & 두 개가 모두 실행될 때만 작동합니다. ! 나는에있어 이후 Java RMI 예외 사용시 연결 작성! = 기계

Exception creating connection to: 192.168.244.1; nested exception is: 
java.net.SocketException: Network is unreachable 
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:632) 
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128) 

이 방식에 의한 이해가되지 않습니다 : 나는 = 컴퓨터에 클라이언트^서버를 시작으로 서버가 콜백을 호출하려고했을 경우 즉시, 나는 예외가 10.0.0.x 서브넷,이 IP는 어디서 오는가?

코드는 두 개의 클래스 {Server | Client} 인터페이스를 구현하는 서버 & 클라이언트로 구성됩니다. RMIRegistry에서 서버 객체를 가져오고 로그인 메소드를 호출하는 데 아무런 문제가 없습니다. 코드가 실행되면 서버 측에서 중단 점을 볼 수 있지만 콜백 명령이 오자마자 실패합니다. 예외는 클라이언트 측 btw입니다.

두 컴퓨터 모두에서 방화벽을 사용하지 못하게 시도했습니다. 나는 예외가 나를 보내는 ip에서 문제가 온다고 생각하지만 그것이 어디서 오는 것인지 알 수 없다. (Client.java) 마지막으로

public class Client extends UnicastRemoteObject implements ClientInterface { 

    public static void main(String[] args) { 
     try { 
      new Client(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (NotBoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Client() throws RemoteException, MalformedURLException, NotBoundException { 
     ServerInterface s = null; 
     s = (ServerInterface) Naming.lookup("rmi://10.0.0.48/server"); 
     s.login(this); 
    } 

    @Override 
    public void talk() throws RemoteException { 
     System.out.println("Talkiiiing"); 
    } 
} 

(ClientInterface.java)

public interface ClientInterface extends Remote { 
    void talk() throws RemoteException;; 
} 

(Server.java)

public class Server extends UnicastRemoteObject implements ServerInterface { 

    public Server() throws RemoteException, MalformedURLException { 
     LocateRegistry.createRegistry(1099); 
     if (System.getSecurityManager() == null) 
      System.setSecurityManager(new RMISecurityManager()); 
     Naming.rebind("rmi://localhost:1099/server", this); 
    } 

    public static void main(String[] args) { 
     try { 
      new Server(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void login(ClientInterface clientInterface) throws RemoteException { 
     clientInterface.talk(); 
    } 
} 

그리고 다음은

다음 코드입니다 (ServerInterface.java)

public interface ServerInterface extends Remote { 
    void login(ClientInterface clientInterface) throws RemoteException; 
} 

답변

1

이것은 java.rmi.server.hostname의 전형적인 문제입니다. item A.1 in the RMI FAQ을 참조하십시오. 서버 JVM의 java.rmi.server.hostname을 클라이언트가 연결할 때 사용할 주소로 설정해야합니다. 이 문제는 잘못 구성된 DNS로 인해 발생합니다. 아마도 문제를 해결할 수 있습니다. 'localhost'는 127.0.0.1로 해결되어야하며 호스트 이름은 실제 IP 주소로 확인되어야합니다.

+0

나는 실제로 DNS가 여기에서 왜 호출되는지를 보지 못했다. 어떤 성공도없이 localhost를 127.0.0.1로 변경하려고했습니다. 문제 A.1은 Naming.Loockup (..)을 할 수 없을 때 발생한다고 생각합니다. 그러나 나는 서버의 원격 메소드가 클라이언트의 콜백을 호출하려고 할 때 문제가 발생합니다. 편집 : 나는 당신이 제안한 시도한 및 여전히 동일한 예외가 있습니다 : ( – Cuva

+0

@downvoter 설명하십시오. – EJP

+0

@ user1729268 콜백을 시도 할 때 문제가 발생하면 그것은 클라이언트의 IP 주소 및 DNS 문제입니다. 이 경우 클라이언트 JVM에서 java.rmi.server.hostname을 서버가 사용할 IP 주소로 설정해야하기 때문에 클라이언트가 콜백의 관점에서 볼 때 서버이기도합니다. 클라이언트 방화벽이나 NAT 장치 뒤에 있기 때문에 인바운드 포트가 전달되지 않으면 작동하지 않으며 java.rmi.server.hostname을 NAT 장치의 IP 주소로 설정해야합니다. – EJP