RPC::PlClient v0.2012

by Hippo2000(2000/12/24)

DBD::Proxyの元、RPC::PlClientなのです。Java RMIに対応するようなものだということです。

作者はJochen Wiedmannさんです。それにしても、この方は色々なものを作っています。

Jochen Wiedmannさんにはメールで了解をいただきました。

なお内容等が間違っていたら修正します。ご連絡ください。


目次


名前

RPC::PlClient - PlRPCクライアントを書くためのPerl拡張


概要

  require RPC::PlClient;
  # クライアント・オブジェクトを作成し、サーバーに接続する
  my $client = RPC::PlClient->new('peeraddr' => 'joes.host.de',
                                  'peerport' => 2570,
                                  'application' => 'My App',
                                  'version' => '1.0',
                                  'user' => 'joe',
                                  'password' => 'hello!');
  # $class->new()を呼ぶことにより$classのインスタンスをサーバーに、
  # 対応するインスタンスをクライアントに作成する。
  my $object = $client->Call('NewHandle', $class, 'new', @args);
  # $objectのメソッドを呼び出す。実際には対応するサーバー・インスタンスで
  # 同じメソッドが呼ばれる。
  my $result = $object->do_method(@args);

説明

PlRPC (Perl RPC) はPerlベースのクライアント/サーバー・アプリケーションを書くことを簡単にするパッケージです。RPC::PlServerがサーバー側で使われるパッケージであり、RPC::PlClient はお分かりの通りです。この部分については RPC::PlServer(3)をご覧ください。

PlRPCはクライアントにより実行されるメソッドのセットを定義することにより動きます。 例えばサーバーはメソッド "multply" をクライアントに提供するとします。そうすると関数の呼出しはクライアントでは以下のようになります。

    @result = $client->Call('multiply', $a, $b);

これはサーバーでは以下のように対応する呼出しに対応づけられます

    $server->multiply($a, $b);

関数呼出しの結果ははクライアントに転送され、クライアントのメソッドの呼出しとして返されます。簡単でしょ? :-)


クライアント・メソッド

$client = new(%attr);
(クラス・メソッド)クライアント・コンストラクタ。サーバーに接続されたクライアント・オブジェクトを返します。エラーの場合にはPerlの例外が投げられます。そこで典型的には以下のように使います:
    $client = eval { RPC::PlClient->new ( ... ) };
    if ($@) {
        print STDERR "Cannot create client object: $@\n";
        exit 0;
    }

このメソッドはキー/値の組のリストを引数として受け取ります。以下の引数が分かります:

peeraddr
 
peerport
 
socket_proto
 
socket_type
 
timeout
これらはIO::Socket::INETの PeerAddr, PeerPort, Proto, Type そしてTimeout 属性に対応します。サーバー接続はそれらをIO::Socket::INET->new()に渡すことにより確立されます。
socket
接続が確立された後、IO::Socketインスタンスはこの属性に格納されます。もし予め自分自身で接続を確立したければ、独自のIO::Socketのインスタンスを作り、newメソッドへのsocket属性として渡すこともできます。上記の属性はそのような場合には無視されます。
 
application
 
version
 
user
 
password
これはPlRPCの認証(authorization)処理の一部です。これはクライアントはアプリケーション名、プロトコル・バージョンそしてオプションでユーザ名とパスワードを渡すログイン処理に従わなければなりません。これらの引数はサーバーのApplication, Version そして User によって扱われます。
 
compression
これはoff(デフォルト、圧縮なし)またはgzip (Compress::Zlibモジュールが必要)を設定します。
 
cipher
この属性はとても簡単に暗号化を追加するために使われます。PlRPCは特定の暗号化方法ではなく、ブロック暗号化APIに結び付けられています。この属性はblocksize, encrypt そして decrypt メソッドをサポートしている.オブジェクトになります。例えば、Crypt::DES そして Crypt::IDEAがこのようなインターフェースをサポートしています。

実行中に暗号を設定したり、はずしたりできるということに注意してください(undefを属性の値として設定すると暗号化を止めます)、しかし両側が確実に暗号のモードを変更する必要があります。

例:

    use Crypt::DES;
    $cipher = DES->new(pack("H*", "0123456789abcdef"));
    $client = RPC::PlClient->new('cipher' => $cipher,
                                ...);
maxmessage
サービス不能攻撃(denial of service attacks)を避けるため、クライアントとサーバーで交換されるメッセージの大きさは制限されます。デフォルトの上限は65536バイトです。
 
debug
デバッグのメッセージも入れることによりログ・レベルを拡張します。
 
logfile
デフォルトではクライアントはsyslog(Unix)またはイベント・ログ(Windows)にログを出力します。どちらかが使えないか、logfileにTRUE値を渡せば、ログは与えられたファイルハンドル、IO::Handleのインスタンスに出力されます。もし値がスカラーであれば、stderrに出力されます。

例:

  # stderrへログ出力:
  my $client = RPC::PlClient->new('logfile' => 1, ...);
  # 'my.log'へログ出力:
  my $file = IO::File->new('my.log', 'a')
      || die "Cannot create log file 'my.log': $!";
  my $client = RPC::PlClient->new('logfile' => $file, ...);
@result = $client->Call($method, @args);
(インスタンス・メソッド)サーバーでメソッドを呼び出す、引数はサーバー・クラスのメソッド名とメソッド呼出し引数になります。正常であれば、メソッドの結果を返します、そうでなければPerl例がが投げられます。

例:

  @results = eval { $client->Call($method, @args };
  if ($@) {
      print STDERR "An error occurred while executing $method: $@\n";
      exit 0;
  }
$cobj = $client->ClientObject($class, $method, @args)
(インスタンス・メソッド)クライアント側のオブジェクトでで驚くほど簡単に扱えるようにする、予め定義されたメソッドが使用できます。簡単に言うと、クライアントがあなたのためのサーバーオブジェクトの表現を作成します。サーバーに$sobjというオブジェクトとクライアントに対応する$cobjを持っているとします。そして以下のように呼び出します:
  @results = $cobj->my_method(@args);

これはすぐにサーバー側での以下の呼出しに対応づけられます:

  @results = $sobj->my_method(@args);

そして何もプログラムを追加することなく結果を返します。そこでRPC::PlClient::Object:インスタンス、$cobjをどのように作成するのかといえば以下のようにします:

  my $cobj = $client->ClientObject($class, 'new', @args);

これはサーバーで以下の呼出しを引き起こします:

  my $sobj = $class->new(@args);

サーバーには$server->{'methods'}を適切に設定することにより、あるクラスとメソッドの両方を制限することができることに注意してください。


ここではMD5クライアントの例となる簡単なプログラムを作成します。サーバーにはMD5モジュールがインストールされ、ダイジェストを作成します。ここではクライアント部分だけを示します。サーバー部分の例は RPC::PlServer man ページにあります。RPC::PlServer(3)をご覧ください。

    #!/usr/local/bin/perl
    use strict;               # 常によい選択です.
    require RPC::PlClient;
    # 定数
    my $MY_APPLICATION = "MD5_Server";
    my $MY_VERSION = 1.0;
    my $MY_USER = "";           # サーバーがユーザ認証を
    my $MY_PASSWORD = "";       # 要求していない
    my $hexdigest = eval {
        RPC::PlClient->new('peeraddr'    => 'joes.host.de',
                           'peerport'    => 5000,
                           'application' => $MY_APPLICATION,
                           'version'     => $MY_VERSION,
                           'user'        => $MY_USER,
                           'password'    => $MY_PASSWORD);
        # サーバーにMD5オブジェクトを、
        # 関連するクライアント・オブジェクトを作成する。
        #     $context = MD5->new()
        # をサーバー上で実行する。
        my $context = $client->ClientObject('MD5', 'new');
        # サーバーにダイジェストを計算させる。
        #     $context->add("This is a silly string!");
        #     $context->hexdigest();
        # をサーバーで実行する。
        $context->add("This is a silly string!");
        $context->hexdigest();
    };
    if ($@) {
        die "An error occurred: $@";
    }
    print "Got digest $hexdigest\n";

作者と著作権(AUTHOR AND COPYRIGHT)

(原文のまま)

The PlRPC-modules are

  Copyright (C) 1998, Jochen Wiedmann
                      Am Eisteich 9
                      72555 Metzingen
                      Germany
                      Phone: +49 7123 14887
                      Email: joe@ispsoft.de
  All rights reserved.

You may distribute this package under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file.


参考資料

PlRPC::Server(3), Net::Daemon(3), Storable(3), Sys::Syslog(3), Win32::EventLog

アプリケーション例としてDBI Proxy クライアントがあります:

DBD::Proxy(3).


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。