2016-07-24 4 views
0

RMI에 익숙하지 않아 인터넷에서 확신 할 수없는 몇 가지 코드를 발견했습니다. 따라서 rmi 클라이언트와 rmi 서버가 있습니다.RMI : UnicastRemoteObject로 참조 된 서버의 객체

public class RmiServer{ 
    public Wrapper getWrapper(){ 
     return new Wrapper(new Foo()); 
    } 
} 

public class Wrapper implements Serializable{ 
    private FooI foo; 
    public Wrapper(FooI foo){ 
    this.foo=foo; 
    } 
    public void doIt(){ 
    foo.doIt(); 
    } 
} 

public interface FooI extends Remote{ 
    public void doIt(); 
} 

public class Foo implements FooI{ 
public void doIt(){...} 
public Foo(){ 
    //PLEASE, PAY ATTENTION TO THIS LINE 
    UnicastRemoteObject.exportObject(this, 8888); 
} 
} 

이 코드는 이런 식으로 설명합니다. Wrapper 클래스는 직렬화 가능하므로 객체가 RmiClientRmiServer (getWrapper()에서)으로 전송되는 이유입니다. FooRemote 인터페이스를 구현하고 해당 객체는 RmiClient으로 전송되지 않고이 대신에 UnicastRemoteObject이 전송됩니다. 따라서 클라이언트 쪽에서 Wrapper.doIt()이 호출되면 서버 쪽에서 Foo.doIt()이 호출됩니다. 이게 옳은 거니? 그렇지 않은 경우이 솔루션을 설명하는 방법은 무엇입니까?

답변

1

완전히 완전히 무의미합니다. export 된 리모트 오브젝트는, 이미 그 스텁으로서 직렬화되고 있습니다. 스텁은 이미 직렬화 가능합니다. 래퍼 클래스는 여기에 아무 것도 유용하지 않습니다. 그것을 버리고 바로 스텁을 사용하십시오.

우리가주의를 기울여야 할 라인은 단순히 원격 객체를 내 보냅니다. 그것에 대해 놀랄만 한 것은 없습니다.

그래서 클라이언트 측에서 Wrapper.doIt()이 호출되면 서버 측에서 Foo.doIt()이 호출됩니다.

Wrapper.doIt() 서버에서 실행 Foo.doIt()foo.doIt()를 호출한다. 그러나 클라이언트가 foo.doIt()을 직접 호출 한 경우에도 똑같은 일이 발생했습니다. 이것이 바로 RMI가 이미하는 일입니다.

이게 맞습니까?

예.

그렇지 않은 경우이 솔루션을 설명하는 방법은 무엇입니까?

설명 할 수 없습니다. 누군가가 무의미한 래퍼 클래스를 추가했습니다. 모방하지 마십시오.