RMI服务器exception

当我尝试运行使用远程注册表的服务器时,我从RMI获得以下exception。

我在Server2类中的主要方法的注册表编码是

Registry registry = LocateRegistry.getRegistry("192.168.1.4",1100); registry.rebind("Hello",stub); 

192.168.1.4是同一局域网中的另一台机器。

请帮帮我。

 Server2 exception:java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: example.Hello.RemoteHello2 java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: example.Hello.RemoteHello2 at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) at sun.rmi.transport.Transport$1.run(Transport.java:159) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:155) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377) at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) at example.Hello.Server2.main(Server2.java:29) Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: example.Hello.RemoteHello2 at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) at sun.rmi.transport.Transport$1.run(Transport.java:159) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:155) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) 

我有一个名为RemoteHello2的类,我可以确认这一点,因为同一个包中的另一个Server程序运行正常。

我有2个服务器程序,1个使用localhost作为注册表,第2个使用远程服务器作为注册表。

我有这个问题。 事实certificate我通过命令提示符启动了rmi注册表,但是我没有在与server.class相同的文件夹中启动它。 当我将目录更改为server.class所在的位置时,它没有任何问题。

以下是RMI指南的故障排除提示:试一试!! 这应该有所帮助

6.1如果在运行RMI服务器时遇到问题

您可能遇到的第一个问题是在尝试将远程对象绑定或重新绑定到注册表中的名称时收到ClassNotFoundException。 此exception通常是由于代码库属性格式错误导致注册表无法找到远程对象的存根或存根所需的其他类。

请务必注意,远程对象的存根实现了与远程对象本身相同的所有接口,因此这些接口以及声明为方法参数或返回值的任何其他自定义类也必须可从指定的代码库下载。 。

常见的是,由于省略了属性的URL值的尾部斜杠,因此抛出此exception。 其他原因包括:属性的值不是URL; URL中指定的类的路径不正确或拼写错误; 存根类或任何其他必要的类都不能从指定的URL中获得

还要检查运行rmi服务器的类似问题,classnotfound

java.lang.ClassNotFoundException:example.Hello.RemoteHello2

所以看起来你在服务器上的类路径中缺少那个类?

如果注册表本地的实例工作,但不是远程的实例,那么我猜你的java.server.codebase使用的文件:URL,远程注册表无法访问,或远程注册表无法访问http:或ftp:codebase。