关于RMI rmiregistry的怪问题

billdavid 2006-06-06 04:47:12
加精
rmi server程序如果在执行server程序的路径下启动rmiregistry,则可以正常运行server程序,如果在其它路径下启动rmiregistry,则总是报告如下错误:
java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
java.lang.ClassNotFoundException: test.PerfectTimeI
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385
)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
...(以下略)
即无法找到其它类,怎么回事呢?
在网上搜了一下,说是运行的rmiregistry可能是其它版本的jre带的,但我查看了一下rmiregistry的执行窗口,都是JDK1.5_06的(而且也不可能两次查找的PATH不一样啊)

Server程序没什么特别的,就是常见的TIJ中的例子:

//PerfectTimeI.java
//The PerfectTime remote interface
package test;

import java.rmi.*;

public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}

//PerfectTime.java
//The implementation of the PerfectTime remote object
package test;

import java.net.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;

public class PerfectTime
extends UnicastRemoteObject
implements PerfectTimeI {
//默认构件器,也要“掷”出RemoteException违例。
public PerfectTime() throws RemoteException {
super();
}

public long getPerfectTime() throws RemoteException {
return System.currentTimeMillis();
}

public static void main(String [] args) {
/*创建和安装一个安全管理器,令其支持RMI.作为Java开发包的一部分,适用于RMI唯一一个是RMISecurityManager.*/
System.setSecurityManager(new RMISecurityManager());

try {
/*创建远程对象的一个或多个实例,下面是PerfectTime对象*/
PerfectTime pt = new PerfectTime();
/*向RMI远程对象注册表注册至少一个远程对象。一个远程对象拥有的方法即可生成指向其他远程对象的句柄,这样,客户到注册表里访问一次,得到第一个远程对象即可.*/
Naming.rebind("PerfectTime", pt);
System.out.println("Ready to do Time");
} catch (Exception e) {
e.printStackTrace();
}
}
}
...全文
2570 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yanbin_Q 2006-06-28
  • 打赏
  • 举报
回复
只是按Think in java 就班来试验RMI代码是运行不了的

你可以用最简的方式运行一个体验RMI,可以不用命令rmiregister来启动注册服务,
详细说明,我写的两篇日志如下:


JAVA RMI 快速入门实例 http://www.blogcn.com/user82/unmi/blog/36321143.html

分为以下四个步骤

1. 创建远程接口及声明远程方法(HelloInterface.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
4. 客户端查找远程对象,并调用远程方法(HelloClient)
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用


运行 Think In Java中的 RMI 示例可能产生的几种异常及解决 http://www.blogcn.com/user82/unmi/blog/36327904.html

楼主出现异常可能是没有用rmic命令生成stub类,这个步骤在Think in java里有说明

另外,看那两篇还有不明白的地方可直接留言,我将尽快努力去解答,希望能与优秀的Blog交换链接。
billdavid 2006-06-13
  • 打赏
  • 举报
回复
超感谢:YuLimin(阿敏总司令:简单就是美)
问题已解决,看了一下rmiregistry的code,但是不大明白为什么必须如此修改。
rmiregistry只是用一个Hashtable保存名称到object的映射,找不出来哪里会去loadclass啊?
wateray 2006-06-12
  • 打赏
  • 举报
回复
好象只能在server路径下启动。
为了怕麻烦,我是写了个脚本。

@echo off
cd server
start rmiregistry
start javaw -Djava.security.policy=rmi.policy -jar Server.jar



eureka0891 2006-06-12
  • 打赏
  • 举报
回复
YuLimin(阿敏总司令:简单就是美) 的说法是正确的,你的classpath设置不对,根本不关rmi的事情

start rmiregistry
set CLASSPATH=.;E:\Server.jar
start javaw -Djava.security.policy=rmi.policy -jar Server.jar


YuLimin 2006-06-10
  • 打赏
  • 举报
回复
想清楚没有?问题解决了吧:)
billdavid 2006-06-07
  • 打赏
  • 举报
回复
司令,我不是说了“rmi server程序如果在执行server程序的路径下启动rmiregistry,则可以正常运行”吗?所以必要的环境变量都是已经设置好了的。

下面再详细解释一下:
1.我的所有程序均放置在E:\test下,并已声明package test;并编译通过;
2.主要程序代码见第一帖,相信没有什么问题;
3.如果在E:\下执行start rmiregistry以启动rmi注册服务,则可以正常启动服务程序test.PerfectTime;
4.若是在任何其它目录下启动rmiregistry,则无法启动服务程序test.PerfectTime。
真的是很奇怪啊?!
YuLimin 2006-06-07
  • 打赏
  • 举报
回复
关键在于:

你在start rmiregistry前
set CLASSPATH=.;E:\一下,然后再执行start rmiregistry

不知道你是否明白了???还没有吃饭呢:)闪人了啦。。。Good Lucky赫赫:)
YuLimin 2006-06-07
  • 打赏
  • 举报
回复
java.lang.ClassNotFoundException: test.PerfectTimeI

很明显了。。。是不是?

OK,你在start rmiregistry前
set CLASSPATH=.;E:\一下,然后再执行start rmiregistry

这样后,再执行服务程序

然后再执行客户端程序,就可以了。。。
YuLimin 2006-06-06
  • 打赏
  • 举报
回复
设置JAVA_HOME=E:/JDK/1.5
设置PATH=.;%JAVA_HOME%/bin
设置CLASSPATH=.;

java.lang.ClassNotFoundException: test.PerfectTimeI
这个是你的路径问题啊。。。

PATH!!!

62,630

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧