May 8, 2002
onlax2, Digital UNIX V5.0 (Rev. 910) システムでのJavaRMIの実行
--- hello world実行#1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(http://www-online.kek.jp/~inoue/para-CAMAC/
Test/Hello-JavaRMI.html)
高エネルギー加速器研究機構
素粒子原子核研究所
物理、オンライングループ
井上 栄二
(1). 現状確認
(A). Webサーバ、onlax2にjava version "1.1.7B-6" がインストール
されている。
(2). ここでやるべきこと
Digital UNIX V5.0 (Rev. 910)、onlax2のマシン上でJavaRMIでのhello world
を実行する。
(3). コンパイル
(3-1). Javaのチェック
onlax2.kek.jp[96]% java -version
java version "1.1.7B-6"
onlax2.kek.jp[97]%
(3-2). 実行環境
onlax2.kek.jp[97]% env
TERM=vt100
HOME=/people/inoue
SHELL=/bin/csh
USER=inoue
LOGNAME=inoue
PATH=.:/people/inoue/bin:/usr/jsy/bin:/usr/ucb:/bin:/usr/bin:/usr/local/X11/bin:
/kek/bin:/people/inoue/onlsun1/bin:/usr/local/bin:/usr/bin/X11:/usr/new:/usr/loc
al/bin/mh:/usr/sbin:/usr/jsy/new/emacs:/usr/hosts:/kek/local/bin
SHLVL=1
I18NPATH=/usr/i18n
LANG=ja_JP
MANPATH=/usr/local/majordomo-1.94.4/man
MAIL=/usr/spool/mail/inoue
EXINIT=set redraw wm=8
PRINTER=ps
KCODE=EUC
WWW_HOME=http://www.kek.jp
NNTPSERVER=keknews.kek.jp
DOMAINNAME=kek.jp
JSERVER=localhost
CLASSPATH=/people/inoue/public_html/myclasses
onlax2.kek.jp[98]%
(3-3). サーバ側の準備
この実行で使用するソースコードは、以下のURLから入手した。
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/rmi/archives/getStart.zip
パッケージ名は examples.hello、ソースディレクトリは
~/JavaRMI/getStart/examples/hello である。
onlax2.kek.jp[98]% pwd
/people/inoue/JavaRMI/getStart/examples/hello
onlax2.kek.jp[99]% ls -l
ディスク上の専有領域の合計 5 (KBytes)
-rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java
-rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java
-rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java
-rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html
-rw-r--r-- 1 inoue kek 81 10月01日 1998 policy
onlax2.kek.jp[100]%
*.java ソースファイルをコンパイルして、.class ファイルを作成する。 次に
rmic コンパイラを実行してスタブとスケルトンを作成する。
javac や rmic コンパイラを使うときは、生成されるクラスファイルをどの
ディレクトリに置くかを指定しなければならない。 アプレットの場合には、
すべてのファイルをアプレットのコードベースディレクトリに置く必要がある。
この例では、コードベースディレクトリはonlax2:$HOME/public_html/myclasses
になる。
(3-3-1). ランタイムパスを設定する
onlax2.kek.jp[105]% setenv CLASSPATH .:$HOME/public_html/myclasses:$HOME/JavaRMI
/getStart/examples/hello
onlax2.kek.jp[106]% printenv CLASSPATH
.:/people/inoue/public_html/myclasses:/people/inoue/JavaRMI/getStart/examples/he
llo
onlax2.kek.jp[107]%
onlax2.kek.jp[125]% pwd
/people/inoue/public_html/myclasses
onlax2.kek.jp[126]% ls -l
ディスク上の専有領域の合計 0 (KBytes)
onlax2.kek.jp[127]%
(3-3-2). ソースファイルをコンパイルする
onlax2.kek.jp[130]% pwd
/people/inoue/JavaRMI/getStart/examples/hello
onlax2.kek.jp[131]% ls -l
ディスク上の専有領域の合計 5 (KBytes)
-rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java
-rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java
-rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java
-rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html
-rw-r--r-- 1 inoue kek 81 10月01日 1998 policy
onlax2.kek.jp[132]%
onlax2.kek.jp[132]% cat Hello.java
package examples.hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
onlax2.kek.jp[133]%
onlax2.kek.jp[133]% cat HelloApplet.java
package examples.hello;
import java.applet.Applet;
import java.awt.Graphics;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class HelloApplet extends Applet {
String message = "blank";
// "obj" is the identifier that we'll use to refer
// to the remote object that implements the "Hello"
// interface
Hello obj = null;
public void init() {
try {
obj = (Hello)Naming.lookup("//" +
getCodeBase().getHost() + "/HelloServer");
message = obj.sayHello();
} catch (Exception e) {
System.out.println("HelloApplet exception: " +
e.getMessage());
e.printStackTrace();
}
}
public void paint(Graphics g) {
g.drawString(message, 25, 50);
}
}
onlax2.kek.jp[134]%
onlax2.kek.jp[134]% cat HelloImpl.java
package examples.hello;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject
implements Hello {
public HelloImpl() throws RemoteException {
super();
}
public String sayHello() {
return "Hello World!";
}
public static void main(String args[]) {
// Create and install a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
HelloImpl obj = new HelloImpl();
// Bind this object instance to the name "HelloServer"
Naming.rebind("HelloServer", obj);
System.out.println("HelloServer bound in registry");
} catch (Exception e) {
System.out.println("HelloImpl err: " + e.getMessage());
e.printStackTrace();
}
}
}
onlax2.kek.jp[135]%
onlax2.kek.jp[135]% cat hello.html
<HTML>
<title>Hello World</title>
<center> <h1>Hello World</h1> </center>
The message from the HelloServer is:
<p>
<applet codebase="myclasses/"
code="examples.hello.HelloApplet"
width=500 height=120>
</applet>
</HTML>
onlax2.kek.jp[136]%
onlax2.kek.jp[136]% cat policy
grant {
// Allow everything for now
permission java.security.AllPermission;
};
onlax2.kek.jp[137]%
onlax2.kek.jp[137]% javac -d $HOME/public_html/myclasses Hello.java HelloImpl.ja
va HelloApplet.java
onlax2.kek.jp[138]%
onlax2.kek.jp[138]% ls -lR $HOME/public_html/myclasses
ディスク上の専有領域の合計 1 (KBytes)
drwxr-x--x 3 inoue kek 512 05月08日 14:12 examples/
/people/inoue/public_html/myclasses/examples:
ディスク上の専有領域の合計 1 (KBytes)
drwxr-x--x 2 inoue kek 512 05月08日 14:12 hello/
/people/inoue/public_html/myclasses/examples/hello:
ディスク上の専有領域の合計 5 (KBytes)
-rw-r--r-- 1 inoue kek 282 05月08日 14:12 Hello.class
-rw-r--r-- 1 inoue kek 1364 05月08日 14:12 HelloApplet.class
-rw-r--r-- 1 inoue kek 1306 05月08日 14:12 HelloImpl.class
onlax2.kek.jp[139]%
(3-3-3). rmic を使ってスタブまたはスケルトンを生成する
onlax2.kek.jp[139]% pwd
/people/inoue/JavaRMI/getStart/examples/hello
onlax2.kek.jp[140]% ls -l
ディスク上の専有領域の合計 5 (KBytes)
-rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java
-rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java
-rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java
-rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html
-rw-r--r-- 1 inoue kek 81 10月01日 1998 policy
onlax2.kek.jp[141]% rmic -d $HOME/public_html/myclasses examples.hello.HelloImpl
onlax2.kek.jp[142]%
onlax2.kek.jp[142]% ls -lR $HOME/public_html/myclasses
ディスク上の専有領域の合計 1 (KBytes)
drwxr-x--x 3 inoue kek 512 05月08日 14:12 examples/
/people/inoue/public_html/myclasses/examples:
ディスク上の専有領域の合計 1 (KBytes)
drwxr-x--x 2 inoue kek 512 05月08日 14:18 hello/
/people/inoue/public_html/myclasses/examples/hello:
ディスク上の専有領域の合計 9 (KBytes)
-rw-r--r-- 1 inoue kek 282 05月08日 14:12 Hello.class
-rw-r--r-- 1 inoue kek 1364 05月08日 14:12 HelloApplet.class
-rw-r--r-- 1 inoue kek 1306 05月08日 14:12 HelloImpl.class
-rw-r--r-- 1 inoue kek 1569 05月08日 14:18 HelloImpl_Skel.class
-rw-r--r-- 1 inoue kek 1854 05月08日 14:18 HelloImpl_Stub.class
onlax2.kek.jp[143]%
(3-3-4). HTML ファイルを配置ディレクトリに移す
onlax2.kek.jp[144]% pwd
/people/inoue/JavaRMI/getStart/examples/hello
onlax2.kek.jp[145]% ls -l
ディスク上の専有領域の合計 5 (KBytes)
-rw-r--r-- 1 inoue kek 175 06月05日 1998 Hello.java
-rw-r--r-- 1 inoue kek 751 06月05日 1998 HelloApplet.java
-rw-r--r-- 1 inoue kek 956 06月05日 1998 HelloImpl.java
-rw-r--r-- 1 inoue kek 245 10月01日 1998 hello.html
-rw-r--r-- 1 inoue kek 81 10月01日 1998 policy
onlax2.kek.jp[146]% cp hello.html $HOME/public_html
onlax2.kek.jp[147]% ls -l $HOME/public_html/hello.html
-rw-r--r-- 1 inoue kek 245 05月08日 14:22 /people/inoue/public_htm
l/hello.html
onlax2.kek.jp[148]%
(4). RMI レジストリ、サーバ、およびアプレットを起動する
(4-1). RMI レジストリを起動する
RMI レジストリは、単純なサーバ側のネームサーバで、これによりリモート
クライアントは、リモートオブジェクトへの参照を取得できる。
onlax2.kek.jp[156]% ps
PID TTY S TIME CMD
222558 pts/5 I + 0:00.83 -csh (csh)
217202 pts/11 S 0:01.98 -csh (csh)
223862 pts/12 I + 0:00.90 -csh (csh)
52373 pts/14 I + 0:00.57 -sh (csh)
onlax2.kek.jp[157]% rmiregistry &
[1] 224727
onlax2.kek.jp[158]%
(4-2). サーバを起動する
onlax2.kek.jp[159]% java -Djava.rmi.server.codebase=http://onlax2.kek.jp/~inoue/
myclasses/ -Djava.security.policy=$HOME/JavaRMI/getStart/examples/hello/policy e
xamples.hello.HelloImpl
HelloServer bound in registry
(4-3). アプレットを実行する
この状態でWebブラウザで "http://onlax2.kek.jp/~inoue/hello.html" に
アクセスすると、"Hello World!"
と表示される。
(4-4). サーバ側プロセスの停止
onlax2.kek.jp[159]% java -Djava.rmi.server.codebase=http://onlax2.kek.jp/~inoue/
myclasses/ -Djava.security.policy=$HOME/JavaRMI/getStart/examples/hello/policy e
xamples.hello.HelloImpl
HelloServer bound in registry
onlax2.kek.jp[160]% ps
PID TTY S TIME CMD
222558 pts/5 I + 0:00.83 -csh (csh)
217202 pts/11 S 0:02.03 -csh (csh)
224727 pts/11 I 0:00.15 /usr/ucb/../bin/alpha/native_threads/rmiregist
224868 pts/11 S 0:05.90 /usr/ucb/../bin/alpha/native_threads/java sun/
223862 pts/12 I + 0:00.97 -csh (csh)
52373 pts/14 I + 0:00.57 -sh (csh)
onlax2.kek.jp[161]% kill -KILL 224868
onlax2.kek.jp[162]% /usr/ucb/../bin/alpha/native_threads/rmiregistry: 224868 Kil
led
[1] 終了コード -119 rmiregistry
onlax2.kek.jp[162]% ps
PID TTY S TIME CMD
222558 pts/5 I + 0:00.83 -csh (csh)
217202 pts/11 S 0:02.04 -csh (csh)
223862 pts/12 I + 0:00.97 -csh (csh)
52373 pts/14 I + 0:00.57 -sh (csh)
onlax2.kek.jp[163]%
---xxxx