2016-07-24 29 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クラスは直列化可能であるため、そのオブジェクトはRmiClientからRmiServer(getWrapper()で)に転送されます。 FooRemoteインターフェイスを実装しており、そのオブジェクトはRmiClientには転送されず、この参照の代わりにUnicastRemoteObjectが転送されます。したがって、クライアント側ではWrapper.doIt()が呼び出され、サーバ側ではFoo.doIt()が呼び出されます。これは正しいですか?そうでない場合、この解決策を説明する方法は?

答えて

1

これは完全に無意味です。エクスポートされたリモートオブジェクトは、既にスタブとしてシリアル化されています。スタブはすでにシリアライズ可能です。ラッパークラスはここで何も役立たないものを追加しています。それを投げ捨て、スタブを直接使用してください。

注目したいラインは、リモートオブジェクトをエクスポートするだけです。それについて何も驚くことはありません。

したがって、クライアント側ではWrapper.doIt()が呼び出され、サーバ側ではFoo.doIt()が呼び出されます。

Wrapper.doIt()は、サーバーでFoo.doIt()を実行foo.doIt()を呼び出します。しかし、クライアントがfoo.doIt()を直接呼び出すと、同じことが起こりました。それはまさにRMIが既にしていることです。

これは正しいですか?

はい。

この解決策を説明する方法はありますか?

説明できません。誰かが無意味なラッパークラスを追加しました。真似しないでください。

関連する問題