3. JavaRM
I
入
门实战
4.
使用
RM
I
和
CORBA
进
行分布式
java
程序
设计
5. Think in
java
中
网络编
程
RM
I
部分
Java RM
I
实
例
关键
字
:
rm
i
我下面
贴
出代
码
的例子是
网
上
转来
的,
我在
这
里主要要
说
一下在
跑
通
这个
例子可能
会
遇到的
问题
和解
决办
法,希望能
为
初
学
的朋友
节
省
时间
,以便快速入
门
RM
I
创
建
RM
I
程序的
6
个
步
骤
:
1
、定
义
一
个远
程接口的接口,
该
接口中的每一
个
方法必
须声
明
它将产
生一
个
Re
m
oteException
异
常。
2
、定
义
一
个实现该
接口的
类
。
3
、使用
RM
IC
程序生成
远
程
实现
所需的
残
根和框架。
4
、
创
建一
个
服
务
器,用于
发
布
2
中
写
好的
类
。
5.
创
建一
个
客
户
程序
进
行
RM
I
调
用。
6
、
启动
rm
iRegistry
并运
行自己的
远
程服
务
器和客
户
程序
1
步
定
义
一
个远
程接口的接口,
该
接口中的每一
个
方法必
须声
明
它将产
生一
个
Re
m
o
teException
异
常
Java
代
码
1.
pac
kage
rm
i;
2.
3.
i
m
port
java.
rm
i.
Re
m
o
teException;
4.
5.
/**
6.
*
第一步,定
义
一
个远
程接口,
该
接口中的每一
个
方法必
须声
明
它将产
生一
个
Re
m
oteException
异
常
7.
*/
8.
9.
//
接口里定
义
一
个
返回字符串的
远
程方法
SayHello
(),
这个远
程接口
I_Hello
必
须
是
public
的
10.
//
它
必
须从
java.
rm
i.
Re
m
o
te
继
承而
来
,接口中的每一
个
方法都必
须
抛出
远
程
异
常
java.
rm
i.
Re
m
o
teException
。
11.
//
12.
//
抛出
这个异
常的原因
:
由于任何
远
程方法
调
用
实际
上要
进
行
许
多低
级网络
操作,
因此
网
络错误
可能在
调
用
过
程中
随时发
生
13.
//
因此,所有的
RM
I
操作都
应
放到
try
-
c
atc
h
块
中
14.
15.
16.
//
需要
从
Re
m
o
te
继
承
17.
public
interface
I_Hello
extends
java.
rm
i.
Re
m
o
te{
18.
19.
//
需要抛出
r
e
m
o
te
异
常
20.
public
String
SayHello()
throws
Re
m
o
teException;
21.
}
2
步
定
义
一
个实现该
接口的
类
Java
代
码
1.
pac
kage
rm
i;
2.
3.
i
m
port
java.
rm
i.*;
4.
i
m
port
java.
rm
i.server.
UnicastRe
m
o
teObjec
t
;
5.
6.
/**
7.
*
第二步,定
义
一
个实现远
程接口的
类
8.
*/
9.
10.
//
实现
接口的
类
必
须继
承
UnicastRe
m
o
teObjec
t
类
,
扩
展
java.
rm
i.server.
UnicastRe
m
o
teObjec
t
11.
12.
public
class
Hello
extends
UnicastRe
m
o
teObjec
t
//
必
须从
UnicastRe
m
o
teObjec
t
继
承
13.
i
m
ple
m
ents
I_Hello
{
14.
public
Hello()
thr
ows
Re
m
o
teException{
//
需要一
个
抛出
Re
m
o
te
异
常的默
认
初始化方法
15.
}
16.
17.
public
String
SayHello(){
//
这个
是
实现
I_Hello
接口的方法
18.
r
e
turn
"Hello
w
orld
!!";
19.
}
20.
}
3
步
使用
RM
IC
程序生成
远
程
实现
所需的
残
根
Stub
和
框架
这
一步是
关键
,也是最容易出
问题
的地方,需要多
说
几句:
在
RM
I
中,客
户
机上生成的
调动调
用
参数
和反
调动
返回
值
的代
码称为残
根。有的
书
上
称这
部分
代
码为
“主干”。
服
务
器上生成的反
调动调
用
参数
和
进
行
实际
方法
调
用
调动
返回
值
的代
码称为
框架
2
中的
Hello
编译
好以后,我
们
就可以用
RM
IC
命令
来
生成
残
根
Stub
操作是:在
c
m
d
下到
Hello.class
所在目
录
,
运
行以下命令:
rm
ic
Hello
命令
执
行完以后,
将会
在
当
前目
录
生成一
个
Hello_Stub.class
这个
就是我
们远
程
调
用
时
需
要的
类
如果
您
是照着上面的方法做的,
现
在
应该会
遇到
报
的第一
个错
:
Class xxx not
found
解
决
方法分
两
步
首先,
打
开环
境
变
量,
将项
目路
径
D:\workspace_bohai_
FXM\z
test
(
项
目名)
\rm
i
(包
名)添加到
classpath
中
,在
c
m
d
下
se
t
一下,看看是否
设
置好了
然后,
c
m
d
下
输
入要注意,如果
你
要
rm
ic
的
.class
文件在包下,就必
须
cd
到目
标
.class
文件所在包的目
录
下,此例是:
D:\workspace_bohai_
FXM\z
tes
t>rm
ic
rm
i.
Hello
,
在
你
的
rm
i
目
录
下
会
生成
两个
文件
Hello_Stub.class
和
Hello_Skel.class
。
Hello_Stub.class
这个
就是我
们远
程
调
用
时
需要的
类
4
步
创
建一
个
服
务
器,用于
发
布
2
中
写
好的
类
Java
代
码
1.
pac
kage
rm
i;
2.
3.
i
m
port
java.
rm
i.*;
4.
5.
/**
6.
*
4
步,
创
建一
个
服
务
器,用于
发
布
类
Hello
7.
*/
8.
9.
public
class
RM
I_Server
{
10.
public
static
void
m
ain(String[]
args)
{
11.
try
{
12.
//
实
例化要
发
布的
类
13.
Hello
hello
=
new
Hello();
14.
//
绑
定
RM
I
名
称
进
行
发
布,即客
户
端通
过这个
名字
查
找的
对
象就是
hello
这个实
例
15.
Na
m
ing.
rebind("
RM
I_
Hello",
hello);
16.
Syste
m
.out.
println("===
Hello
ser
ver
Ready
===
");
17.
}
cat
ch
(Exception
exception)
{
18.
exception.
printS
tac
kTrace();
19.
}
20.
}
21.
}
5
步
创
建一
个
客
户
程序
进
行
RM
I
调
用
Java
代
码
1.
pac
kage
rm
i;
2.
3.
/**
4.
*
5
步,
创
建一
个
客
户
程序
进
行
RM
I
调
用
5.
*/
6.
7.
i
m
port
java.
rm
i.*;
8.
9.
public
class
RM
I_Client
{
10.
public
static
void
m
ain(String[]
args)
{
11.
try
{
12.
I_Hello
hello
=
(I_
Hello)
Na
m
ing.
lookup("
RM
I_Hello");
//
通
过
RM
I
名
称查
找
远
程
对
象
13.
//
如果是
异
地的
RM
I
调
用
请参
照
rm
i://127.0.0.1:1099/RM
I_Hello
14.
//
端口
1099
是默
认
的
RM
I
端口,如果
你启动
rm
i
registry
的
时
候
,
没
有指定特殊的端口
号
,默
认
就是
1099
15.
16.
Syste
m
.out.
println(hello.SayHello());
//
核心句:
调
用
远
程
对
象
的方法
17.
}
cat
ch
(Exception
e)
{
18.
e.pr
intS
tac
kTrace();
19.
}
20.
}
21.
22.
}
6
步
启动
rm
iRegistry
并运
行自己的
远
程服
务
器和客
户
程序
c
m
d
下
运
行命令
rm
iregistry
,然后放在一
边
不用管他(第一
个
c
m
d
窗口)
然后通
过
c
m
d
运
行
Server
,直接在
IDE
里
运
行一般
会报错
:
找不到
Stub
类
,需要用下面的
命令
来运
行,命令里指定了
stub
类
的路
径
c
m
d
到
D:
\workspace_bohai_
FXM\z
tes
t>
目
录
下
运
行
java.exe
-
Djava.
rmi.server.codebase=file:/D:\workspace_bohai_
FXM\z
tes
t
/
rmi.
RM
I_Server
(注意:
z
t
ext
是
项
目名,
rm
i
是包,最后的那
个
z
t
est
/
后有一
个
空格)
回
车
后
c
m
d
会显
示:
===
Hello ser
ver
Ready
===
(代表
Server
成功
启动
,第二
个
c
m
d
窗口)
然后在
运
行
Client
就
会
看到
你
千辛万苦
远
程方法
调
用的
结
果:
Hello
w
orld !!
呵呵,如果在上面
过
程中
你
遇到了其他
问题
,
实
在是不好意思了,我只是把我
尝试
RM
I
时
遇到
的
问题
的解
决办
法
贴
出
来
了,祝好
运
1234567890ABCDEFGHIJKLMNabcdefghijklmn!@#$%^&&*()_+.一三五七九贰肆陆扒拾,。青玉案元夕东风夜放花千树更吹落星如雨宝马雕车香满路凤箫声动玉壶光转一夜鱼龙舞蛾儿雪柳黄金缕笑语盈盈暗香去众里寻他千百度暮然回首那人却在灯火阑珊处