サンプルプログラムの説明
サンプルプログラムは、4種類あり、次のようになっています。
これらのプログラムを利用するには、付属の Makefile を使って、サンプルプログラムをコンパイルします。
ファイルを解凍した後、Makefile を実行環境に合わせて適当に設定して下さい。
その後、make を実行すれば、サンプルプログラムを利用するためのファイルが生成されます。
以下で各サンプルプログラムの利用法を説明します。
ハノイの塔(ストリーム通信利用)
概要
このサンプルプログラムは、今回作成したメッセージインタフェースのストリーム通信を利用した例となっています。
KLIC 側でハノイの塔を解くプログラムを記述してあり、Java 側では、アプレットでハノイの塔の
GUI が記述されています。
この2つのプログラムを、メッセージインタフェースのストリーム通信を利用し通信を行います。
実行方法
このプログラムを実行するには、まず、KLIC 側のサーバプログラムを立ち上げます。
コンパイルを行ったディレクトリで、
と実行します。Java 側のプログラムは、WWW ブラウザ等から起動してもよいのですが、ここでは
JDK に付属のアプレットビューアーで実行することとします。
とすれば、Java 側のアプレットが起動し、サンプルプログラムが利用できます。
アプレットの上部の左にある数字は、ハノイの塔の円盤の数を示しています。
これは、1から10まで変更可能です。
中央の "solve" というボタンは、現在の円盤の状態を KLIC 側に送信し、ハノイの塔を解かせるものです。
左の "shuffle" というボタンは、円盤をでたらめに並べ替えるためのものです。
なお、下部のグラフィック部分で、円盤をドラッグすると、円盤を移動させることができます。
プログラムの説明
KLIC 側はサーバプログラムとして動き、Java 側はクライアントとして動作します。
ソケットとメッセージインターフェースは、アプレットの "solve" ボタンを押されるたびに生成、切断するようになっています。
ストリームに流れるデータは、まず Java 側から、円盤の状態を示すデータと、移動先の棒の番号を送ります。
送られたデータは、KLIC 側で受け取られ、その解く手順を計算し、Java 側に送り返し、ソケットを閉じます。
そして、Java 側で、解法を受け取り、それをアニメーションで表示します。
円盤の状態は、左の棒から、中央の棒、右の棒のそれぞれの円盤の状態をリストにして送信されます。
各棒のデータは、下側にある円盤から、上側にある円盤まで、円盤の大きさをリストにして示します。
例えば、[[4,3,2,1],[],[]] のようなデータになります。
棒の番号は、左の棒から、0,1,2というようになっています。
また、解法のデータは、どの棒からどの棒に円盤を移動するか、move(From,
To) の形で表現し、それをリストにして送られます。
使用するファイル
-
メッセージインターフェースのための KLIC と Java のそれぞれのファイル
-
hanoi.html
アプレットを貼り付けてある HTML ファイル
-
main-ds.kl1
KLIC 側のメインプログラム
-
hanoi.kl1
KLIC 側でハノイの塔を解くプログラム
-
HanoiDS.java
Java 側のメインプログラム
-
HanoiData.java, HanoiCanvas.java, HanoiCanvasDisk.java, HanoiCanvasMouseListener.java,
DoubleBufferedCanvas.java, MouseEventWrapper.java
Java 側でハノイの塔のGUIを提供するためのプログラム
ハノイの塔(手続き呼び出し利用)
概要
このサンプルプログラムは、今回作成したメッセージインタフェースの Java から
KLIC への手続き呼び出し型の通信を利用した例となっています。
ストリーム通信の代わりに手続き呼び出しを利用する以外は、前述のハノイの塔(ストリーム通信利用)と同じです。
実行方法
このプログラムを実行するには、まず、KLIC 側のサーバプログラムを立ち上げます。
コンパイルを行ったディレクトリで、
と実行します。Java 側のプログラムは、WWW ブラウザ等から起動してもよいのですが、ここでは
JDK に付属のアプレットビューアーで実行することとします。
appletviewer hanoi-pc.html
とすれば、Java 側のアプレットが起動し、サンプルプログラムが利用できます。
なお、Java からの呼び出しがあると、KLIC 側で、"abnormal close" と出力されます。
これは、ストリーム通信のためのプログラムを流用しているため表示されるので、無視してかまいません。
プログラムの説明
アプレットの "solve" ボタンを押すと、ソケットとメッセージインターフェースを生成し、KLIC
側の hanoi:hanoi/3 を呼び出します。
呼び出しの引数や、戻り値は、ハノイの塔(ストリーム通信利用)の場合と同じ形のものです。
使用するファイル
-
メッセージインターフェースのための KLIC と Java のそれぞれのファイル
-
hano-pci.html
アプレットを貼り付けてある HTML ファイル
-
main-ds.kl1
KLIC 側のメインプログラム
-
hanoi.kl1
KLIC 側でハノイの塔を解くプログラム
-
HanoiPC.java
Java 側のメインプログラム
-
HanoiData.java, HanoiCanvas.java, HanoiCanvasDisk.java, HanoiCanvasMouseListener.java,
DoubleBufferedCanvas.java, MouseEventWrapper.java
Java 側でハノイの塔の GUI を提供するためのプログラム
Sleep
概要
このサンプルプログラムは、今回作成したメッセージインタフェースの Java からKLICへの手続き呼び出し型の通信を利用した例となっています。
KLIC 側から、Java の Sleep クラス の sleep() メソッドを呼び出します。
実行方法
このプログラムを実行するには、まず、Java 側のサーバプログラムを立ち上げます。
コンパイルを行ったディレクトリで、
と実行します。次に、
として、KLIC 側のクライアントプログラムを実行します。実行すると、
call..return("98/02/29 00:00:01")
call..return("98/02/29 00:00:02")
call..return("98/02/29 00:00:03")
のような実行結果が得られると思います。
プログラムの説明
このプログラムは、KLIC 側から、Java にある Sleep.sleep() メソッドを呼び出します。
メソッドの引数として、KLIC の整数データとして1を渡します。
呼び出しの戻り値として Java 側の時間を取得し、その値をエラー出力に出力するようになっています。
Sleep.sleep() は、呼び出されてから、メソッドの引数に指定された秒数、つまり1秒間スレッドを停止して、復帰した時の時間を返します。
このメソッドを3回呼び出すようにプログラムしてあるので、実行結果は1秒ずつ違う値を返すと思います。
使用するファイル
-
メッセージインターフェースのための KLIC と Java のそれぞれのファイル
-
main-pc.kl1
KLIC 側のメインプログラム
-
Sleep.java
Java 側のメインプログラム
データI/O
概要
このサンプルプログラムは、KLIC のプログラムに GUI でデータを与えるプログラムです。
Java の GUI では、データの作成や表示もグラフィカルに行うことができるようになっています。
メッセージインターフェースのストリーム通信を用いて KLIC 側と、Java
側のプログラム間で通信を行います。
KLIC 側のプログラムは、今回作成したメッセージインタフェースのストリーム通信を用いるようにプログラムしてあれば、任意のプログラムが利用できるようになっています。
なお、以下の説明では、KLIC 側のプログラムとして、前述のハノイの塔(ストリーム通信利用)を利用します。
実行方法
まず、KLIC 側のサーバプログラムを起動します。
コンパイルを行ったディレクトリで、
と実行します。Java 側のプログラムは、WWW ブラウザ等から起動してもよいのですが、ここでは
JDK に付属のアプレットビューアーで実行することとします。
とすれば、Java 側のアプレットが起動し、サンプルプログラムが利用できます。
送信するデータ内容についてはハノイの塔のサンプルプログラムの説明を、データI/O
の GUI の使い方については以下の説明を参考にデータを入力して下さい。
例えば、"[[2,1],[],[]]" と "1" をデータとして送った場合、"[move(0,2),
move(0,1), move(2,1)]" といったデータが KLIC 側から送られてきて、接続が切断されると思います。
プログラムの説明
Java 側のプログラムは、クライアントプログラムとして動くようになっているので、KLIC側のプログラムは、サーバプログラムとしてプログラミングを行う必要があります。
あとは、KLIC 側のプログラムは、ストリーム通信を用いて通信を行うようにすれば、インタラクティブにデータを入出力することが可能になります。
Java 側のプログラムはアプレットとして記述してあります。
アプレットが実行されると、2つのウィンドウが開きます。
1つは、データを入力するためのウィンドウで、もう1つは、データを出力するウィンドウです。
アプレット本体の方は、上部に、接続操作を行うための "connect", "disconnect"
ボタンがあります。
中央には、これまでのデータ送受の履歴を表示する、ヒストリリストがあります。
下部のテキストフィールドは、ステータスバーです。
データ入力ウィンドウでは、右ボタンをプレスすると表示されるポップアップメニューで各種操作を行います。
"new" の中にある "atom", "integer", "string" を用いてプリミティブデータを作成します。
ファンクタを作成するには、まず、主ファンクタ名を表すアトムを作成し、そのアトムに引数のデータをドラッグ&ドロップすることにより、そのアトムがファンクタになります。
ファンクタの主ファンクタ部分にさらにデータをドラッグ&ドロップすると、そのファンクタの引数にデータを追加することができます。
なお、ファンクタ構造のデータの指定は、一番親となるファンクタ構造の主ファンクタ部分で行います。
また、ファンクタ構造の出力で、コンスセルの表示のみ、別のレイアウトで表示されるので注意して下さい。
データの出力ウインドウでは、基本的に KLIC 側から送られたデータを表示しています。
ただし、アプレットのメイン画面にあるヒストリリストでデータを選択すると、そのデータを表示させることができます。
データをKLIC側に送るには、データ入力ウィンドウでデータを作成し、送信するデータをクリックして選択した後、"send"
ボタンを押すことにより送信できます。
なお、指定したデータの文字列表現が、"send" ボタンの下のテキストフィールド上に示されます。
なお、"send" ボタンの左にある数字は、データを"送信"するストリームのポート番号の指定できる、おまけ機能のためのものです。
普通は、0のまま利用して下さい。
データの削除は、削除するデータ上で、ポップアップメニューを表示し、"delete"
を選択すれば削除できます。
ファンクタから、引数の一つをはずしたい場合は、はずしたい引数の上でポップアップメニューを表示し、"remove"
を選択することによって行います。
文字列や、整数、アトム、主ファンクタ名の値を変更したいときは、そのデータの上で、ポップアップメニューを表示し、"property"
を選択します。
なお、データをクリックして選択した後、データの何もない場所でダブルクリックすると、選択されたデータがコピーされます。
アプレットのパラメータとして、ソケットの接続先のポート番号を指定できます。
dataio.html を参考にしてください。
なお、ソケットの接続先は、Java アプレットのセキュリティ上の制限により
HTML ファイルがあるサーバマシン上プロセスしか利用できないので注意してください。
使用するファイル
-
メッセージインターフェースのための KLIC と Java のそれぞれのファイル
-
dataio.html
アプレットを貼り付けてある HTML ファイル
-
main-ds.kl1, hanoi.kl1
KLIC 側のサンプルプログラムであるハノイの塔を解くサーバプログラム
-
DataIO.java
Java 側のメインプログラム
-
KDI.java, KDICanvas.java, KDPropertyDialog.java, Node.java, DoubleBufferedCanvas.java,
MouseEventWrapper.java
Java 側でデータI/Oの GUI を提供するためのプログラム