2016-10-06 32 views
0

私はRMIをとても新しくしています。私はexportObject(Object, int)メソッドで混乱しました。ドキュメントには、Java RMI exportObjectメソッドの理解

リモートオブジェクトをエクスポートして、指定のポートを使用して、受信 コールを受信できるようにエクスポートします。 オブジェクトが RMISocketFactoryクラスを使用して作成したサーバソケットでエクスポートされます。

は、次の簡単な例で考えてみましょう:だから私たちはスタブを作成し、別の​​手動またはRmiRegistry経由に転送されます

public interface Client extends Remote { 
    void clientMethod() throws RemoteException; 
} 

public class ClientImpl implements Client { 
    public clientMethod() throws RemoteException { 
     System.out.println("clientMethod invoked"); 
    } 
} 

Client stub = (Client) UnicastRemoteObject 
       .exportObject(new ClientImpl(), 56789); //<------ HERE 

を、ここでは関係ありません。

私は、彼らが何を意味するのか?「[...] [...]オブジェクトがサーバソケットでエクスポートされた」ことでは

混乱していますか

+1

これは、サーバー側のリモートオブジェクトにサーバーソケットが含まれることを意味します。あなたの 'Client'スタブは、サーバにサーバソケットを、クライアントにクライアントソケットを保持します。あなたの 'Client'はクライアントでない限りサーバーです。 –

+1

Javaの[ServerSocket](https://docs.oracle.com/javase/8/docs/api/java/net/ServerSocket.html)を理解していますか?着信TCP要求をリッスンし、RMIがネットワークレベルで動作する場所です。 –

+0

@ E_net4したがって、スタブを別のVM(VM 0)に転送すると、スタブは最初に作成されたVM(VM 2)へのソケット接続を保持します。 trurnのVM 2は、着信メソッド呼び出しを受け入れるためのサーバーソケットを維持します。あれは正しいですか? –

答えて

2
  • ServerSocketエクスポート時に指定したポートで着信接続を待機するように作成されます。このポートは、複数のリモートオブジェクト間で共有できます。
  • RMISocketFactoryに関する声明は間違っています。あなたはどこを読んだのですか?
  • スタブには、サーバーのホスト名またはIPアドレスとポート番号、およびサーバーが属するリモートオブジェクトを識別する内部データが含まれています。
  • 接続プール経由でリモートメソッドを呼び出すと、スタブとリモートオブジェクト間のTCP接続が必要に応じて作成されます。我々は別のVM(VM 0)にスタブを転送するとき

ので、スタブは、それが最初に作成されたVM(VM 2)へのソケット接続を保持します。

いいえ、上記を参照してください。

VM 2は、着信メソッドの呼び出しを受け入れるためのサーバーソケットを維持します。

正しい。

+0

私はドキュメントでそれを読んでいます。 https://docs.oracle.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject.html#exportObject-java.rmi.Remote-int- –