gpt4 book ai didi

java - Java RMI 服务器/客户端实现出现错误

转载 作者:行者123 更新时间:2023-12-01 11:39:55 26 4
gpt4 key购买 nike

我目前正在另一个线程上关注 RMI 的小教程,here is the link !我遇到的问题是,如果我将所有类放在同一个项目上(我使用的是 Netbeans),那么它可以完美地工作,但在现实生活中,客户端和服务器通常是不同的机器,所以当我尝试将在不同的项目上的客户端并实现相同的接口(interface)和 SomeStruct 类,然后我收到以下错误:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: rmiserver.SomeInterface (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at clientrmi.SomeClient.main(SomeClient.java:17)
Caused by: java.lang.ClassNotFoundException: rmiserver.SomeInterface (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:556)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:255)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1559)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
... 3 more

如果我在客户端实现以下代码:

if(System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}

然后我收到以下错误:

java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1234" "connect,resolve")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
at java.net.Socket.connect(Socket.java:584)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:342)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)

关于如何解决这个问题有什么想法吗?任何意见都非常感谢!

最佳答案

我认为你的问题是你总共需要3个项目:

  1. 第一个项目包含界面。
  2. 第二个项目包含服务器并将第一个项目添加为库之一。
  3. 第三个项目包含客户端并将第一个项目添加为库之一。

关键是客户端和服务器项目都必须在项目内部有接口(interface)(相同的接口(interface))。

您的错误:java.lang.ClassNotFoundException:rmiserver.SomeInterface(无安全管理器:禁用 RMI 类加载器)说它找不到你的类:SomeInterface。我不认为安全管理器是您真正的问题。

希望有帮助。

关于java - Java RMI 服务器/客户端实现出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29611563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com