2016-07-30 5 views
1

rmi 서버가 있고 컴퓨터에 여러 네트워크 어댑터가 있습니다.RMI : rmi 서버가 동시에 하나의 네트워크 인터페이스에서만 작동 할 수 있습니까?

내 RMI 서버의 java.rmi.server.hostname 속성을 설정해야합니다 java.rmi.ConnectException: Connection refused to host: 127.0.1.1;를 얻을하지 않기 위해 그것은 JVM의 한 인스턴스에 동시에 RMI 서버가 하나에서만 작동 할 수 있다는 것을 의미

않습니다 (https://stackoverflow.com/a/15696021/5057736 참조) OS 설정이없는 네트워크 인터페이스?

+0

나는 포트가 내가 당신을 이해하지 못하는 cricket_007 @ 네트워크 인터페이스 –

+0

보다 문제가 더 생각 - 내가 RMI 작업 포트 아무 문제가 없다. 문제는 다른 네트워크 인터페이스를 사용하는 것입니다. –

+0

어쩌면 내가 오해했을 것입니다. 두 네트워크 인터페이스 모두 동일한 호스트 이름과 문제를 해결합니까? –

답변

0

https://community.oracle.com/blogs/emcmanus/2006/12/22/multihomed-computers-and-rmi과이 https://community.oracle.com/thread/1178328?start=0을 읽은 후 다음 솔루션을 사용했습니다. 우리는 모든 응용 프로그램에서 RMIRemoteObjects를 내보내고 한 곳에 모았습니다. 이 솔루션을 사용하면 RMI가 JVM의 한 인스턴스에서 다른 네트워크 인터페이스와 동시에 작동 할 수 있습니다. RmiRemoteManager는 모든 소켓 주소 (네트워크 인터페이스 + 포트)에 대해 생성됩니다. 내보내기 전에 java.rmi.server.hostname을 정의해야합니다. 이 솔루션은 작동합니다. RMI 제한의 해결 방법임을 기억하십시오.

class ClientSocketFactory implements RMIClientSocketFactory,Serializable{ 

    private InetAddress address; 

    public ClientSocketFactory(InetAddress address) 
    { 
     this.address = address; 
    } 

    @Override 
    public Socket createSocket(String host, int port) throws IOException { 
     Socket socket =new Socket(address, port); 
     return socket; 
    } 

    @Override 
    public boolean equals(Object that) 
    { 
     return that != null && this.getClass() == that.getClass(); 
    } 
} 

class ServerSocketFactory implements RMIServerSocketFactory{ 

    private InetAddress address; 

    public ServerSocketFactory(InetAddress address) 
    { 
     this.address = address; 
    } 

    @Override 
    public ServerSocket createServerSocket(int port) throws IOException{ 
     return new ServerSocket(port, 0, address); 
    } 

    @Override 
    public boolean equals(Object that) 
    { 
     return that != null && this.getClass() == that.getClass(); 
    } 
} 

public class RmiRemoteManager { 

    private Registry registry; 

    private InetSocketAddress socketAddress; 

    private ServerSocketFactory serverSocketFactory; 

    private ClientSocketFactory clientSocketFactory; 

    public RmiRemoteManager(InetSocketAddress socketAddress) { 
     try { 
      this.socketAddress = socketAddress; 
      serverSocketFactory=new ServerSocketFactory(InetAddress.getByName(socketAddress.getHostName())); 
      clientSocketFactory=new ClientSocketFactory(InetAddress.getByName(socketAddress.getHostName())); 
      //the registry is exported via createRegistry. 
      registry = LocateRegistry.createRegistry(this.socketAddress.getPort(),clientSocketFactory,serverSocketFactory); 
     } catch (UnknownHostException ex) { 
      Logger.getLogger(RmiRemoteManager.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (RemoteException ex) { 
      Logger.getLogger(RmiRemoteManager.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    private synchronized static Remote export(Remote remoteObject,InetSocketAddress sa,ClientSocketFactory csf,ServerSocketFactory ssf){ 
     try { 
      System.setProperty("java.rmi.server.hostname",sa.getHostName()); 
      return UnicastRemoteObject.exportObject(remoteObject,sa.getPort(),csf,ssf); 
     } catch (RemoteException ex) { 
      Logger.getLogger(RmiRemoteManager.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return null; 
    } 

    public void export(Remote remoteObject,String url){ 
     try { 
      Remote stub=export(remoteObject,socketAddress,clientSocketFactory,serverSocketFactory); 
      remoteObjects.add(remoteObject); 
      if (url!=null){ 
       urlsByRemoteObjects.put(remoteObject, url); 
       registry.rebind(url, stub); 
      } 
     } catch (RemoteException ex) { 
      Logger.getLogger(RmiRemoteManager.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
1

설정 java.rmi.server.hostname은 스텁에 기록되는 내용에만 영향을줍니다. 듣기에는 아무런 영향을 미치지 않습니다. RMIServerSocketFactory을 사용하지 않는 한 RMI는 항상 0.0.0.0을 수신합니다.

+0

@ JimJim2000 이러한 질문을 더 많이 할 예정이라면 필자는 나의 책 * java.rmi : Remote Method Invocation 가이드 * Pitt & McNiff, Addison Wesley 2001을 보유 할 것을 제안 할 수 있습니다. 인쇄하지만 s/h는 많이 복사됩니다. 지금까지 물어 본 모든 것이 거기에서 다루어집니다. – EJP

+0

의견을 보내 주셔서 감사합니다. 당신의 대답은 어떨까요? 우리가 하나의 JVM 인스턴스를 가지고 있고 거기에 두 개의 RmiServers 192.168.1.0:2525와 192.168.1.1:3636이 있다고 가정 해 봅시다. 그렇다면 모든 스텁의 답변이 동일한'java.rmi.server.hostname'으로 작성 될 것이므로 하나의 서버에 대한 스텁 만 작동하게됩니까? –

+0

맞습니다. – EJP