lipermimodその7 CallLookup

lipermimodその6の続きである。

時には接続中の相手のIPアドレスを知りたい場合がある。クライアント側とサーバ側では方法が異なる。

例となる接続

今、以下のような接続を行うとする。クライアント側はClientという単一のオブジェクトでサーバ側と接続している。サーバ側としては、複数のクライアントと接続する可能性がある。

public class Basic {

  /** 接続に使用するポート番号。何でも良いがオリジナルのlipermiでは4455になっている */
  public static final int PORT = 4455;

  /** サーバが公開するオブジェクトの名称 */
  public static final String GLOBAL = "serverGlobal";

  public static void main(String[]args) throws IOException {

    // サーバを作成し、グローバルオブジェクトを作成して公開し、4455でクライアントの接続を待つ
    Server server = new Server();
    server.registerGlobal(GLOBAL, new ServerGlobalImpl());
    server.bind(PORT);

    // クライアントを作成し、サーバに接続する。当然ながらサーバはlocalhost
    // サーバの公開するオブジェクトを取得し、そのメソッドを呼び出す。
    Client client = new Client();    
    client.connect("localhost", PORT);    
    ServerGlobal serverGlobal = client.getGlobal(GLOBAL);
    System.out.println("client side:" + serverGlobal.hello("hello"));
  }

  /** サーバの公開するオブジェクトのインターフェース。必ずIRemoteを実装する必要がある */
  public static interface ServerGlobal extends IRemote {
    public String hello(String value);
  }

  /** サーバによる公開オブジェクトの実装 */
  private static class ServerGlobalImpl implements ServerGlobal {
    public String hello(String value) {
      System.out.println("server side:" + value);
      return value + " world";
    }
  }
}

クライアント側での接続取得

そもそもクライアント側は、サーバのアドレス(この例では”localhost”)を指定したのだから、サーバ側IPアドレスがわからないということは無いのだが、しかし、サーバとの接続ソケットそのものを取得する方法がある。

Connection connection = client.getConnection();
Socket socket = connection.getSocket();

サーバ側での接続取得

サーバ側のサービスメソッドで、サービス要求してきたそれぞれのクライアントを知りたい場合、これはメソッドの引数としては得られない。上の例の場合には、以下のメソッド内でこれを呼び出したクライアントを知りたいのである。

    public String hello(String value) {
      System.out.println("server side:" + value);
      return value + " world";
    }

この場合には、staticなメソッドCallLookup.getConnection()を使う。

    public String hello(String value) {
      System.out.println("server side:" + value);
      Connection connection = CallLookup.getConnection();
      Socket socket = connection.getSocket();
      ....
      return value + " world";
    }

lipermimodは、サービスメソッドを呼び出す前に、現在のスレッドとクライアントのコネクションを結びつけており、これにより、当該クライアントの接続を得ることができる。