Java Communications API (2) |
はじめに | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
前回は基礎編ということで、 Java Communications API を使用して RS-232C 通信を行う方法の解説を行いました。今回は応用編ということで、実際に Communications API を使用したアプリケーションを作成して行きたいと思います。 FA で使われる機器の中で RS-232C を使用できるものはいろいろありますが、そのような機器の 1 つとして筆者の所属する横河電機に DARWIN という製品を取りあげました。今回はこの DARWIN を使用して温度の監視システムを作っていきたいと思います。 DARWIN は温度・電圧・電流・流量・圧力などの測定データの収集を行う装置群の総称です。このシリーズにはPC と接続してデータ収集を行う DA100 や、チャートレコーダとして使用するハイブリッドレコーダ DR130 などがあります。DARWIN は RS-232C や GP-IB、Ethernet などを使用して PC などに接続することができ、またさまざまな種類のモジュールをつけ替えて使用することができます。 今回は DARWIN シリーズの中の DA100 を使用します。まず、DA100 と RS-232C で接続した PC でローカルに監視を行うシステムを作成します。ただし、DA100 をお持ちでない方にもサンプルを動作させることができるように DA100 のシミュレータも作ってみました。 次に、これを基本にして他のコンピュータからリモートで温度監視を行うシステムに発展させて行こうと思います。本講座の 1 回目から 3 回目でソケットを使ったリモート監視システムの解説を行いましたが、同じ方法ではつまらないので、ソケット以外の方法で通信を使用していきましょう。Java のコアライブラリには RMI (Remote Method Invocation) という ORB (Object Remote Broker: リモートにあるオブジェクトにアクセスするための機構) がありますので、これを使用していきます。 ●DARWIN Web Page ●DARWIN DA100 紹介ページ
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
▲このページのトップへ戻る | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
温度監視システムの設計 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
温度監視システムを作成する前に、システムの設計をして行きましょう。設計は UML (Unified Modeling Language) を使用して行いました。ここでは UML に関する解説は省略させていただきますが、オブジェクト指向設計を行うには欠かせないものになっています。OMG でも UML を標準として採用しており、今後ますます普及して行くと思います。詳しくは次にあげた Web サイトや参考書籍をご覧ください。 ●オージス総研 UML チュートリアル ●オージス総研 UML レファレンス ●かんたん UML ●UML ユーザガイド 温度監視システムはオペレータが装置が収集したデータを何らかの方法で監視するわけですが、これをユースケース図で記述すれば次のようになります。図の中で人型で表されたものがアクタ、楕円で表されているのがユースケースです。アクタには監視システムを使用するオペレータと、データの収集を行う機器があります。オペレータはデータの監視 (参照) を行います。データ監視ユースケースは DA100 からデータを収集し、それをオペレータに参照させるという動作になります。
このユースケースを実現するためのクラス構成を考えて行きましょう。オペレータが監視をするためには何らかのデータ表示を行わなくてはなりません。今回はこの講座の第 6 回で作成したバーメータを使用していきましょう。また、機器と通信してデータを収集するためのクラスも必要です。そして、この 2 つのクラスをまとめるためのクラスがあります。データ収集を行うクラスを DataCollector、システムをまとめるためのクラスを TemperatureMonitor クラスとしました。 ここで DataCollector について考えてみましょう。今回は機器は DA100 としましたが、実際にはデータの収集ができ、そのデータを何らかの手段でコンピュータに送信する機器であればなんでもいいわけです。使う側から見れば、なるべく同じ使い方でどんな機器でも使えるようにしたいだけでしょう。しかし、クラスのメソッドが独自に作られていれば、使い方は変わってしまいます。 そこで、DataCollector はデータ収集を行うためのメソッドを定義したインタフェースとして、実際の機器と通信するクラスは DataCollector インタフェースをインプリメントするようにして行きます。今回は Darwin だけしか使わないので、DarwinDataCollector クラスだけを実装していきます。しかし、機器を変更する場合はこれに対応するクラスを作る必要があります。 全体のクラス図は図 3 のようになります。TemperatureMonitor クラスが BarMeter と DataCollector の関連を持っています。
データ収集から表示の一連の処理方法はイベントを使った方法などいろいろ考えられますが、ここでは図 4 に示した単純な方法をとりました。TemperatureMonitor オブジェクトが周期的に DataCollector オブジェクトにデータ収集させるのですが、図 4 では一回分のデータ収集の流れを示しています。
まず、TemperatureMonitor オブジェクトが DataCollection オブジェクトにデータ収集の依頼します。その結果、返ってきたデータを BarMeter オブジェクトにセットします。BarMeter オブジェクトは値がセットされると、表示の更新を行います。その後、インターバルをとって、再びデータ収集を繰り返します。 システムの大まかな構成や処理が分かってきたので、設計はここまでにしておき、次の章から実際にコードを書いていきましょう。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
▲このページのトップへ戻る | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DARWIN を使用したデータ収集 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
まず、RS-232C を使用してデータ収集を行う部分から説明していきます。前述したように、この部分は DataCollection インタフェースをインプリメントしたクラスを使用します。DA100 を使用して温度のデータを収集するので、このクラスを DarwinDataCollector としましょう。
まず、データを収集する前に、RS-232C を利用するための処理が必要です。処理は前回説明したように CommPortIdentifier を取得 -> SerialPort のオープン -> 通信条件の設定 -> Writer/Readerのとりだし という流れで行います。DarwinDataCollector クラスでは CommPortIdentifier の取得をコンストラクタ、残りの部分を open メソッドの中で行っています。 コンストラクタを次に示します。処理自体は前回示したコードと変わりありません。CommPortIdentifier#getPortIdentifier
メソッドを使用して CommPortIdentifier オブジェクトを取得します。ポート名は簡単にするためメンバ変数で設定してしまいましたが、Pure
Java のアプリケーションにするならば設定ファイルから読み込ませるようにするなどの工夫が必要です。また、Solaris で動作させる場合や、COM1
以外のポートで動作させる場合はこの値を変更する必要があります。
次に open メソッドでポートのオープンからストリームの取出しまで行います。 DA100 と RS-232C で通信するための通信条件はDA100 の前面にあるディップスイッチを使用して設定します。詳しくは DA100 の「DA100 データアクイジションユニット 通信インタフェースユーザーズマニュアル」を参照していただくことにしますが、今回は工場出荷時の初期設定の値をそのまま使用していきます。パラメータは次のとおりです。
DarwinDataCollector クラスではこれらの値をメンバ変数に直接記述していますが、これもポート名と同様に設定ファイルなどから読み込むようにさせたほうが汎用的につかえるようになります。 すこし長くなりますが、ストリームの取出しまでの部分を次に示してみます。
3 から 7 行目で前述した通信条件を記述しています。ポートのオープンは 12 行目です。オープンができたら、通信条件の設定を行います。これは 35行目からの setSerialPortParameters メソッドで行っています。まず、38 行目でボーレート、データ長、ストップビット長、パリティを設定し、39行目でフローコントロールを設定します。 Writer は 46 行目からの getWriter メソッドで取得します。前回説明をしたのと同様にここでも BufferedWriter をかぶせることでパフォーマンスを向上させます。Reader は 60 行目からの getReader メソッドです。こちらも BufferedReader をかぶせます。 これで RS-232C 通信の準備は整いました。それでは DA100 と通信する部分を記述して行きましょう。 DA100 と通信を行うには DA100 のコマンドを使用しておこないます。基本的には何らかのコマンドをコンピュータから DA100 に送信し、その返答を受け取るというスタイルになります。 コマンドには文字列を使用します。コマンドは行単位で DA100 に送信するため、コマンド文字列の最後に 16進数で 0A 0D を送信します。DA100 は 0A 0D まで受信するとコマンド解析を行い、戻り値を送信します。この場合も行単位で送信され、行末には 0A 0D が送信されます。戻り値がない場合でも ACK が返るようになっています。したがって、何らかのコマンドをコンピュータ側から送信したら、必ず受信を行わなくてはなりません。 DA100 の詳しいコマンドの解説は省略させていただきますが、サンプルで使用したものだけ下表に示しておきます。
RS0 コマンド、RC0 コマンド、SR コマンドは初期化時に一度だけ使用されます。SR コマンドで指定する入力の種類には次のようなものがあります。
今回は温度の測定を行うので SR コマンドの p2 は TC、p3 は K タイプの熱電対を使いましたので、K としました。 TS コマンドと ESC T、FM コマンドはデータ収集時にペアで使われるのですが、TS コマンドを送信したらかならず ESC T コマンドを送信し、その後 FM コマンドを送信するようにします。FM コマンドの戻り値がデータになり、DA100 からは複数行送信されます。 このようなコマンドを DA100 に送信するわけですが、それぞれのコマンド専用に送信メソッドをつくるより、汎用のコマンド送信メソッドを作ってみましょう。
sendCommand メソッドは引き数で与えられたコマンドを DA100 に送信して、DA100 からの返信を受信し、戻り値とするメソッドです。2 行目でコマンドの送信を行います。writer オブジェクトは PrintWriter クラスのオブジェクトなので、println メソッドが使用できます。このため、行末の 0A 0D を明示的に送信しなくても println メソッドで自動的に付加してくれます。 コマンドを送信したらフラッシュを行い (4 行目) 、DA100 からのデータ待ちになります。DA100 からは必ず行単位で送信されるので readLine を使用することができます。DA100 から送信されたデータを受信して、戻り値にします (14 行目)。 sendCommand メソッドを作ることで、コマンドを送信するのは簡単になります。たとえば、上述した open メソッドの 27 行目でコールされる darwinInitialize メソッドは次のようになります。
単純に RS0 と RC0 を文字列で sendCommand メソッドに送信しているだけです。 同じように入力の指定の部分は次のようになります。
入力の指定には SR コマンドを使用します。今回は温度測定なので、p2 には TC、K 型熱電対を使用するので p3 には K を指定します。ソースでは 1 行目に定数でこれを指定しています。 4 行目の formatter オブジェクトは java.text.NumberFormat クラスのオブジェクトで数値を整形して出力するときに使用します。formatter は 4 から 9 行目の initFormatter メソッドで初期化しています。8 行目で最低でも 3 桁出力するように設定してあるので、たとえば 3 を出力するときでも 003 となります。NumberFormat クラスの format メソッドで整形した文字列を得ることができます。 最小値、最大値はこの NumberFormat を使用して 3 桁の出力を行うようにしてあります。 DA100 からの送信されたデータが 1 行の時は sendCommand メソッドを使用できるのですが、複数行になる FM コマンドの時だけ扱いが異なります。そこで、FM コマンドに特化したメソッドを用意しました。それが次に示す requestData メソッドです。
まず、16 行目でコマンドを送信しています。ここでも、NumberFormat を使用して数値出力の整形を行います。 24 行目から 36 行目のコメントに DA100 が送信するデータのフォーマットが記してあります。受信したデータの 1, 2 行目は日付と時間ですが、今回のサンプルではこの情報は使用しないので、読み込むだけにしてあります (38, 39 行目)。3 行目から実際のデータです。DA100 から複数のチャンネルのデータを収集するときは、チャネル数だけこのフォーマットで DA100 から送信されます。 このフォーマットはカンマの後に数値データが入っているので、java.util.StringTokenizer クラスを使用してカンマの前後で文字列を分割します (48 行目)。java.util.StringTokenizer クラスは特定の文字で文字列を分割するときにとても役立ちます。分割する文字列も選べるので、今回の例のようにカンマ以外の場合でも使用することができます。 切り出した文字列を使用して Double クラスのオブジェクトを生成し、それを Vector クラスのオブジェクトである results に格納します (51 行目)。すべてのチャネルのデータを受信したら results を戻り値として返します。 さて、ここで DataCollector インタフェースが定義しているメソッドを DarwinDataCollector クラスで実装してみましょう。DataCollector インタフェースは次に示す 6 個のメソッドを定義しています。
getChannelSize メソッドは、収集するデータのチャネル数を返します。getMinimumValue メソッドと getMaximumValue メソッドはそれぞれ最小値、最大値を返すメソッドです。この 3 つのメソッドは単に定数を返すだけの単純なものになります。open メソッドと close メソッドは機器のオープンとクローズです。open メソッドはすでに前で示したので、close メソッドだけ示しておきます。
close メソッドでは writer と reader をクローズしてから、ポートをクローズするだけです。 DataCollector インタフェースで最も重要なメソッドがデータを取得するための getData メソッドです。DarwinDataCollector クラスでは次のようにデータを収集しています。
データ収集には、前述したように TS コマンド、ESC T コマンド、FM コマンドを続けて使用します。まず、TS コマンドを送信し (6 行目)、トリガである ESC T を送信します (10 行目)。13 行目の requestData は前に示したように FM コマンドを使用して、データを DA100 から取得する関数です。requestData メソッドの戻り値は Vector ですから、そのまま getData の戻り値として使用できます。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
▲このページのトップへ戻る | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
●ソースはこちらから参照できます TemperatureMonitor.java TemperatureMonitor クラスは DarwinDataCollector オブジェクトと BarMeter オブジェクトを生成ます。また、周期的に DarwinDataCollector オブジェクトにデータ収集を要求し、得られたデータを BarMeter で表示させます。 TemeratureMonitor は DataCollector オブジェクトと BarMeter オブジェクトをメンバ変数にもちます。実際にオブジェクトとして持つのは DarwinDataCollector オブジェクトなのですが、ここではインターフェースの DataCollector を通して操作を行うようにします。こうすることで、機器が変化したとしても必要最小限のソース変更ですむようになります。また、メータは複数あるので Vector に保持することにしましょう。また、周期的な処理を行うための Thread もメンバに変数に持つようにしました。
TemperatureMonitor のコンストラクタでは DarwinDataCollecto オブジェクトと BarMeter オブジェクトを生成します。また、BarMeter オブジェクトを表示するためのウィンドウを生成しています。
4 行目で DarwinDataCollector オブジェクトを生成し、次の行で DA100 のオープンを行います。これで DA100 の準備は終わりましたから、次は GUI です。 バーメータを表示するにはウィンドウがなければならないので、Frame を使用します。12 から 18 行目は Windows でいえばウィンドウの右上の×ボタンをクリックされたときの動作を記述したものです。×をクリックされたら、周期スレッドをストップし (14行目)、DA100 をクローズしてから (15 行目)、システムを終了させます (16 行目)。 最後に BarMeter オブジェクトを生成して Frame オブジェクトに貼りつけます。そして、DA100 に接続されたセンサのチャネルの分だけ BarMeter オブジェクトを生成します (23 行目)。24, 25 行目で色の設定を行い、26, 27 行目で BarMeter の表示最小値と最大値を設定します。さらに BarMeter を Panel に貼りつけ、Panel を Frame に貼りつけます。そして、Vector のオブジェクトである meters に BarMeter オブジェクトを保持させます (31 行目)。 最後に Frame オブジェクトを表示させます。 周期スレッドは start メソッドの中で生成します。スレッドの中心となるのは run メソッドです。
13 行目で DataCollector オブジェクトである collector からデータを取得します。getData メソッドの戻り値は Vector で、複数チャネルのデータが保持されています。その Vector オブジェクトに保持されているオブジェクトを 1 つづつ取り出して (17 行目)、BarMeter オブジェクトにセットします (18 行目)。これをチャネル数くりかえします。BarMeter オブジェクトは setValue がコールされると、表示を更新します。 最後に 22 行目で、次の周期まで sleep します。INTERVAL は定数で 1 秒にしました。 これで監視システムの完成です。コンパイルして実行してみましょう。このアプリケーションはパッケージを第 6 回の BarMeter の時と同様に工業応用部会の URL を使用して、jp.gr.javacons.industry.seminar.tempmonitor としました。したがって、コンパイルと実行は次のようになります。
実行すると、4 つのバーメータが並んで温度を示すようになります。
ここまでは DA100 を使用されていることを前提に説明してきましたが、DA100 をお持ちでない方のために DA100 のシミュレータを作ってみました。 ●ソースはこちらです DarwinSimulator.java DarwinSimulator クラスはシリアルポートを COM2 にハードコーディングしていますので、この他のポートを使用するときにはここを書きかえてください。 同じ PC で、COM1 と COM2 をクロスのシリアルケーブルを使って接続している環境で、DarwinSimulator クラスを使用して TemperatureMonitor を動作させてみましょう。このときは、TemperatureMonitor クラスを実行する前に DarwinSimulator クラスを実行する必要があります。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
▲このページのトップへ戻る | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
リモート監視システムへの発展 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
せっかく監視システムを作ったのですから、リモートでも監視できるようにしてみましょう。RMI を使えばほとんどソースを変更することなくリモート監視システムに発展させることができます。RMI は Java の標準の ORB で、リモートにあるオブジェクトにメッセージセンディングをすることができます。しかも、使い方はとても簡単です。 RMI の解説は Java の公式サイトにある RMI 入門が簡潔で分かりやすいので、参考になさってください。 ●RMI 入門 リモート監視システムに発展させるために作成するクラスとインタフェースは次の 4 つです。
RemoteDataCollector はリモートにあるクライアントに対するサーバ側のインタフェースとなります。サーバ側ではこの RemoteDataCollector をインプリメントした実装クラスが必要になりますが、これが DataCollectorDelegator です。Delegate という単語は移譲などと約されますが、ようするにリモートからの要求を DataCollector に仲介する役目をもつクラスです。 TemperatureMonitorServer クラスと TemperatureMonitorClient クラスは、文字通りサーバとクライアントです。 リモートでの監視のシーケンスは図 6 のようになります。ローカルで監視していた場合は TemperatureMonitor が直接 DataCollector にデータの要求を行っていたのですが、リモート監視では TemperatureMonitorClient と DataCollector の間に RMI で通信を行う RemoteDataCollector と DataCollectorDelegator が入った形になっています。
まず、RemoteDataCollector を作りましょう。このインタフェースは java.rmi.Remote インタフェースを派生させて作ります。また、各メソッドは java.rmi.RemoteException を投げるように設定します。 RemoteDataCollector インタフェースはほとんど DataCollector インタフェースと同じですが、open メソッドと close メソッドだけありません。これは、オープンとクローズはサーバが行い、クライアントは単にデータを表示するだけだからです。
この RemoteDataCollector をインプリメントする実装クラスが DataCollectorDelegator です。
DataCollectorDelegator は java.rmi.server.UnicastRemoteObject を派生させて作ります。コンストラクタで DataCollector が引き数として渡されるので、それをメンバ変数に代入します (9 行目)。コンストラクタは RemoteException を投げるようにすることも RMI の約束のひとつです。 RemoteDataCollector で定義された関数はすべて DataCollector オブジェクトの関数を呼び出しているだけです。 次にサーバのクラスを見ていきましょう。
TemperatureMonitorServer クラスはメンバ変数に DataCollector クラスのオブジェクトと DataCollectorDelegator クラスのオブジェクトを持ちます。コンストラクタではこの 2 つのオブジェクトを生成しています (9, 13 行目)。機器のオープンもここで行います (10 行目)。delegator はリモートからアクセスできるように RMI のネームサービスに登録をします (16 行目)。登録の時にはオブジェクトの名前が必要になります。rebind メソッドの第 1 引き数がその名前になります。名前は //hostname/objectname という形になります。ここではホスト名を localhost にしてありますが、必要に応じて書きかえてください。第 2 引き数が登録を行うオブジェクトになります。 クライアントの TemperatureMonitorClient クラスは TemperatureMonitor クラスとほとんど変わりありません。変更があるのはコンストラクタの部分だけです。 TemperatureMonitor クラスでは DataCollector オブジェクトを直接生成していました。
これが TemperatureMonitorClient クラスでは RMI のネームサーバで検索を行って、RemoteDataCollector オブジェクトを得るようになっています。 検索には名前が必要です。サーバで登録した名前と同じ名前をここで指定します。
RemoteDataCollector オブジェクトを取得できたら、後は TemperatureMonitor クラスとまったく変わりなく、RemoteDataCollector クラスのメソッドをコールすることができます。 コンパイルはサーバとクライアントで別々に行います。また、RMI を使用するために rmic を使用して DataCollectorDelegator の Stub/Skelton を作成する必要があります。
rmic を実行すると DataCollctorDelegator_Stub.class と DataCollectorDelegator_Skel.class の 2 つのファイルが生成されます。この 2 つのクラスがクライアントからのメソッドコールを中継して、サーバに引き渡す役目を担っています。 実行する前に注意しておきたいのですが、このアプリケーションはサンプルということでセキュリティに関してまったく考慮していません。実際に RMI のアプリケーションを作成するときは
の 2 つのことを行わなければなりません。RMI で用意されたセキュリティマネージャは java.rmi.RMISecurityManager クラスです。また、policy ファイルについては次のドキュメントを参照してください。 http://java.sun.com/products/jdk/1.2/ja/docs/ja/guide/security/PolicyFiles.html 実行するときには RMI のネームサーバである rmiregistry をまず実行します。次に、TemperatureMonitorServer を実行しましょう。
実行されると、"TemperatureMonitoringServer start." と表示されるので、これを確認してから TemperatureMonitorClient を実行します。複数の TemperatureMonitorClient を起動することも可能です。 これで Communications API の解説は終わりです。Communications API を使えば、簡単に RS-232C を使えることが分かっていただけたでしょうか。現在は Communications API で使用できるのは RS-232C と IEEE 1284 だけですが、USB や IEEE 1394 (iLink もしくは FireWire) なども同じように Java で使えればいいと望むのは筆者だけでしょうか。今後、RS-232C よりも USB などで接続される機器も増えてくると思われるので、ぜひ実現していただきたいものです。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
▲このページのトップへ戻る | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
おまけ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
本編ではリモート監視システムを RMI で作成しましたが、まったく同じように Socket を使用しても作ることは可能です。その場合、RMI が行っていた ORB の処理を自作する必要があります。簡易的な ORB を実現させるため、クライアント側で動作する DataCollectorProxy クラスと、 サーバ側で動作する DataCollectorStub クラスを作成しました。また、RMI の例で示した RemoteDataCollector インタフェースに相当する SocketDataCollector を導入しました。この 2 つのインタフェースの違いは Remote クラスの派生クラスかどうかという部分と、RemoteException を投げるかどうかです。ですから、定義してある関数はまったく同一です。
Socket 通信は DataCollectorProxy オブジェクトと DataCollectorStub オブジェクトの間で行われます。クライアントが SocketDataCollector に定義してあるメソッドをコールすると、DataCollectorProxy オブジェクトは DataCollectorStub オブジェクトにコールされたメソッド名を送信します。引き続き、メソッドの引き数も送信します。DataCollectorStub はまずメソッド名を受け取り、メソッドに応じた引き数を読み込むようにします。引き数をすべて受信したら、DarwinDataCollector の当該メソッドをコールします。メソッドの戻り値を受け取ったら、DataCollectorProxy に送信します。DataCollectorProxy はこれを受信して、クライアントにメソッドの戻り値として引き渡します。 今回はメソッドの引き数や戻り値に Vector 以外のオブジェクトがなく、Vector に保持してあるデータも double のデータなので、ObjectInput/OutputStream を使用せずに、DataInput/OutputStream を使用しました。メソッドの引き数が何らかのオブジェクトである場合は ObjectInput/OutputStream を使用し、オブジェクトをシリアライズして送信する必要があります。 簡易的な ORB を作ったので、クライアントのコードは RMI やローカル監視の場合とほとんど変わりません。異なるのは、コンストラクタの部分だけです。collector が DataCollectorProxy になっています。DataCollectorProxy は通信するホストをコンストラクタの引き数とします。
これで、RMI の場合とほとんど同じ方法でリモート監視システムが実現できます。ただし、DataCollectorProxy/Stub クラスは DataCollector クラス専用なので、他のクラスを使用するには Proxy/Stub を一から書きなおさなければなりません。RMI は汎用にするために、この部分を rmic を用いて Proxy/Stub の自動生成を行っているわけです。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
▲このページのトップへ戻る | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ソースコードのダウンロード | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
今回用いた全てのソースファイルとクラスファイルはここからダウンロードできます samples.zip samples.zip の中には第 6 回で作成した BarMeter も含まれています。 JavaおよびJavaに関する商標は、米国Sun Microsystems社の登録商標または商標です。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
▲このページのトップへ戻る |