繁体   English   中英

RMI 服务器的问题; Windows 上的 rmiregistry

[英]Problems with RMI Server; rmiregistry on windows


所以我们不得不在课堂上使用 RMI 服务器和客户端进行一些练习。 我们的教授不希望我们使用 `LocateRegirstry.createRegistry()`,相反,我们将从 intellij 外部工具或 cmd 中启动 rmiregistry。 我尝试了几件事,似乎没有任何效果。 我以管理员和普通用户的身份打开了 cmd,从项目的“out”字典中启动了 rmiregistry(教授说它必须在字节码所在的同一个字典中启动)。 建立了原始 rmiregistry 的链接并将其放入“out”字典中,从 intellij 终端、外部工具等启动它,但我无法让它工作。 目前我收到此错误:
 DateServerImpl: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: RMI.DateServer java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: RMI.DateServer at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:391) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:691) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) at java.base/java.security.AccessController.doPrivileged(AccessController.java:391) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:832) at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303) at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279) at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:380) at java.rmi/sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:158) at java.rmi/java.rmi.Naming.rebind(Naming.java:177) at RMI.DateServerImpl.main(DateServerImpl.java:20) Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: RMI.DateServer at java.rmi/sun.rmi.registry.RegistryImpl_Skel.dispatch(RegistryImpl_Skel.java:157) at java.rmi/sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:468) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:298) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:691) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) at java.base/java.security.AccessController.doPrivileged(AccessController.java:391) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:832) Caused by: java.lang.ClassNotFoundException: RMI.DateServer at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) at java.rmi/sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1207) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:468) at java.rmi/sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1221) at java.rmi/sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:731) at java.rmi/sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:674) at java.rmi/sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:611) at java.rmi/java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646) at java.rmi/java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311) at java.rmi/sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:254) at java.base/java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1950) at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1892) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2202) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1712) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:519) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:477) at java.rmi/sun.rmi.registry.RegistryImpl_Skel.dispatch(RegistryImpl_Skel.java:154) ... 14 more

我在谷歌上找不到解决方案(这在大多数情况下都会把我带到这里,遇到类似的问题,但无法通过这些帖子解决任何问题)

这是我使用的代码:

服务器代码

 package RMI; import java.rmi.*; import java.rmi.server.*; import java.util.Date; public class DateServerImpl extends UnicastRemoteObject implements DateServer { public DateServerImpl () throws RemoteException { } public Date getDate () throws RemoteException { System.out.println("Invocation of getDate()"); return new Date (); } public static void main (String[] args) { try { DateServerImpl dateServer = new DateServerImpl (); Naming.rebind ("DateServer", dateServer); System.out.println("The server is up"); } catch (Exception e) { System.out.println("DateServerImpl: " + e.getMessage()); e.printStackTrace(); } } }

接口代码

package RMI; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.Date; public interface DateServer extends Remote { public Date getDate () throws RemoteException; }

所以我希望有人可以在这里帮助我。 我究竟做错了什么?
我希望这是足够的信息,第一次在这里发帖=D
谢谢!

有趣的是,这个问题已经存在了 20 多年。 打开CMD后,您需要设置环境变量CLASSPATH并包含正确查找服务器类所需的每个 JAR/目录,然后启动rmiregistry

所以我刚刚找到了一个解决方法。 我使用 javac 命令通过 cmd 编译它,启动 rmiregistry,然后启动服务器......它工作了。 所以我认为这是 intellij 的问题,因为 .class 和 .java 在不同的字典中,因此异常“找不到类”是有道理的。 现在我只需要找到一种方法来重组intellij ...感谢到目前为止的帮助=D

编辑: Windows上的Intellij需要镜像“out”字典(在 Linux 上似乎完全没有问题,只要您在与字节码(即 .class 文件)相同的字典中启动 rmiregistry)。 所以去

文件->项目结构->模块->路径
选择Use module compile output path,只使用out作为输出

之后,到 intellij 终端,切换到 out 字典,启动 rmiregistry,然后启动服务器。

就是这样,对我有用=D。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM