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 = eval { RPC::PlClient->new ( ... ) };
if ($@) {
print STDERR "Cannot create client object: $@\n";
exit 0;
}
このメソッドはキー/値の組のリストを引数として受け取ります。以下の引数が分かります:
実行中に暗号を設定したり、はずしたりできるということに注意してください(undefを属性の値として設定すると暗号化を止めます)、しかし両側が確実に暗号のモードを変更する必要があります。
例:
use Crypt::DES;
$cipher = DES->new(pack("H*", "0123456789abcdef"));
$client = RPC::PlClient->new('cipher' => $cipher,
...);
例:
# 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, ...);
例:
@results = eval { $client->Call($method, @args };
if ($@) {
print STDERR "An error occurred while executing $method: $@\n";
exit 0;
}
@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";
(原文のまま)
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 クライアントがあります:
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。