Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaRMI-如何从客户端发送回调对象_Java_Rmi - Fatal编程技术网

JavaRMI-如何从客户端发送回调对象

JavaRMI-如何从客户端发送回调对象,java,rmi,Java,Rmi,我使用RMI,我有服务器客户端程序 客户端从服务器访问某些方法 然而,在其中一个方法中,我想传递一个客户机本地对象,使用它的引用服务器将执行回调(回调将在客户机上执行),至少这是我想要的,但可能是我做错了 在客户端 --------------------------------------------------------------------------------- server.setLock("/hello.txt", 99, 125,Locker.Lock_type.WRI

我使用RMI,我有服务器客户端程序

客户端从服务器访问某些方法

然而,在其中一个方法中,我想传递一个客户机本地对象,使用它的引用服务器将执行回调(回调将在客户机上执行),至少这是我想要的,但可能是我做错了

在客户端

---------------------------------------------------------------------------------
   server.setLock("/hello.txt", 99, 125,Locker.Lock_type.WRITE,"Shubham Verma",true, new CallBackProcess());
---------------------------------------------------------------------------------   

CallBackProcess implements an interface which is presented on both the ends. 

But I get this error    

Exception in thread "main" java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: scality.CallBackProcess (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:353)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:701)
    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:160)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy1.setLock(Unknown Source)
    at scality.Client.main(Client.java:31)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: scality.CallBackProcess (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:313)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:701)
Caused by: java.lang.ClassNotFoundException: scality.CallBackProcess (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:393)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:183)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:220)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1611)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1516)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1349)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:324)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:307)
    ... 9 more



基本上,它试图告诉您它无法访问远程代码。它试图反序列化没有定义的类。这些类由客户端从“代码库”加载。它们不是由客户机通过RMI连接加载的,因此它们无法序列化这个它一无所知的类

当您在命令行上启动JVM时,服务器应该指定系统属性“java.rmi.server.codebase”,或者在尝试运行rmi客户端之前在代码中设置它。该值必须是客户端可以访问的URL,并且应该指向要加载的必要类。通常我使用“file://”协议处理程序指定.jar文件


反之亦然:如果客户端返回服务器必须反序列化的类,则服务器必须将代码基属性设置为包含返回类的服务器可以访问的URL。通常,最好为DAO对象及其接口提供一个.jar,由客户端和服务器共享,以避免混淆哪些类需要去哪里。

您还没有导出回调对象,因此它被序列化,而不是作为远程引用传递,而对等方没有实现类,因此会出现此错误。使其扩展UnicastRemoteObject。

正是服务器获得了异常。你把这件事前后颠倒,你错过了根本原因。
public interface Callback extends Remote{
    void execute() throws RemoteException;
}


public class CallBackProcess implements Callback, Serializable{
    public static int test = 0;
    @Override
    public void execute() {
        // need to do something here
    }
}