【问题标题】:Having errors on Java RMI Server/Client ImplementationJava RMI 服务器/客户端实现出现错误
【发布时间】:2015-06-19 03:09:39
【问题描述】:

我目前正在另一个线程here is the link 上关注 RMI 的小教程! 我遇到的问题是,如果我将所有类放在同一个项目中(我使用的是 Netbeans),那么它可以完美运行,但在现实生活中,客户端和服务器通常是不同的机器,所以当我尝试将不同项目上的客户端并实现相同的接口和 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)

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

【问题讨论】:

    标签: java exception rmi


    【解决方案1】:

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

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

    关键是客户端项目和服务端项目都得在项目内部有接口(同一个接口)。

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

    希望对您有所帮助。

    【讨论】:

    • 抱歉,您知道如何在 netbeans 上执行此操作吗?以及如何在不同的项目中使用它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多