转载请表明出处: http://blog.csdn.net/jiangsq12345
对JavaRMI的介绍我就省略了,本文主要是帮助大家解决一个常见的在运行RMI过程中出现的烦人Exception(特别是Stub not found)。
开始前先提醒几点:
1对于.编写代码,我想大家差不多都用的是Eclipse这个IDE,但是对于运行RMI用IDE反而麻烦,所以先做好用命令编译运行java程序的准备 (一般要3个命令窗口,分别是服务器 +客户端 +RMI注册程序rmiregistry )
2.网上有很多教程是写一部分代码编译最后再运行,而我觉得编写代码需要连贯性,因此我提倡先写代码,然后运行RMI; j建议大家先从最简单的例子开始:
4个类(3个在服务器端,1个在客户端); 将这3个类放在同一个包下面,或者如果你不太懂包的含义干脆就默认不用包
。
先了解一下RMI的大致步骤:
1. 创建远程接口及声明远程方法(HelloInterface.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3. 客户端查找远程对象,并调用远程方法(HelloClient)
4. 启动RMI注册服务,并注册远程对象(HelloServer.java)
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用
代码参考 http://topic.csdn.net/u/20090306/22/060e1a70-8d4a-47e9-987c-11637d6d7e7f.html ,我省略
我们重点来说一下编译和运行中的步骤及注意点:
假设我们代码的结构是这样的
+projet
+src
+test(包)
- HelloInterface.java
- Hello.java
- HelloServer.java
-HelloClient.java
1. 编译代码
进入到 ....../workspace/projet/src 文件夹下 (省略号表示你的系统的绝对路径),先给环境变量加一条默认的classpath,
Linux下: export CLASSPATH='....../workspace/projet/src ';
Windows 下可以考虑用手动右击我的电脑手动设置
然后 用命令(前提是你的电脑已经设置好java虚拟机的路径,否则先把这个设置好):
$Javac *.java
2. 用RMIC生成一个stub类
命令(注意到包与类名用. 连接,而且不用.class):
$rmic test.Hello
3. 运行rmiregistry,
用另一个窗口运行命令:
$rmiregistry
4. 运行服务器(我记得早些版本不用再设置路径就可以直接找到stub的,但是现在好像不行了,不管怎么样加个路径中没有错的)
要在....../workspace/projet/src目录下
$java -Djava.rmi.server.codebase=file:/....../workspace/projet/src/ test.HelloServer
5. 运行客户端
要在....../workspace/projet/src目录下
$java test.HelloClient
如果没有其他意外的话,应该可以看到helloworld了。如还有问题可以给在我留言
注:
1. 用RMI传递对象时,必须将对象序列化
2. rmiregistry 默认端口是1099,因此注意服务器端发布服务是端口必须要于此端口一致,否则无法完成注册;会有Connection refuse的exception
3. 如果项目比较大,代码大时,可以用Ant , 例子