Java RMI 远程对象转换/状态

标签 java rmi

我有一个 RMI 应用程序,详细信息如下。服务器知道它正在创建一个 DocumentProvider 对象,并使用 Document 接口(interface)将该对象的引用传递给客户端。当客户端将 Document 对象传递给服务器时,服务器无法再将其转换为 DocumentProvider,尽管这是服务器最初创建的。

有没有办法进行这种类型的转换,即服务器知道它正在创建具有更多内部功能(在本例中为InternalClass serverInfo)的特定Document实现,并且希望在其Document函数的实现中访问这些附加功能(在本例中为“doCast()”函数)。

另一种提问方式:一旦服务器创建了 DocumentProvider 对象,该对象是否位于服务器上?如果是这样,我该如何向客户提供引用?内部类服务器信息;部分不可序列化,并且无法传输到客户端。 (有点像文件句柄等,尽管我可以保留它并在 DocumentProvider 类中管理它)。

//Interface
public interface Document extends extends java.rmi.Remote {
        public String doSomething()  throws java.rmi.RemoteException;
        public String doCast()  throws java.rmi.RemoteException;
}

//The server:
    public class DocumentProvider extends java.rmi.server.UnicastRemoteObject implements java.rmi.Remote, Document {
        InternalClass serverInfo;

        public String doSomething()  throws java.rmi.RemoteException {
            return "DocumentProvider doing something";
        }
        public String doCast(Document d)  throws java.rmi.RemoteException {
            DocumentProvider d2 = (DocumentProvider) d; // this cast fails, even when d was a DocumentProvider class
            // then access d.serverInfo, etc.
        }
    }

public interface DocumentFactory extends extends java.rmi.Remote {
        public Document createDocument() throws java.rmi.RemoteException;
}
public class DocumentProvider extends java.rmi.server.UnicastRemoteObject implements java.rmi.Remote, DocumentFactory {
    public Document createDocument() throws java.rmi.RemoteException {
        return new DocumentProvider();
    }
}

//Client app:
main()... {
    DocumentFactory dFactory = (lookup/resolve this; this works ok);
    Document dMain = dFactory.createDocument();
    dMain.doCast(dMain);  // this fails because
}

详细来说,“InternalClass serverInfo”是一个不可序列化的第三方“句柄”,我必须以某种方式将其状态保留在服务器中,因此主要问题是如何做到这一点,同时返回对远程对象的引用,允许客户端通过接口(interface)中定义的远程调用“操作”该内部对象。 (另一个更简单的例子:如果serverInfo是一个文件句柄,我允许客户端通过Document接口(interface)执行“查找”和“读取”功能)

最佳答案

远程对象作为实现相同远程接口(interface)的 stub 传递和返回。因此,转换为实际的远程对象类是不可能的,并且尝试远程执行它更没有意义。只需使用 stub 作为接口(interface)的实例即可。如果这还不够,那么您的设计就有问题。

关于Java RMI 远程对象转换/状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13922875/

相关文章:

java - 我如何在groovy中从变量收集一段时间的数据?

java - 为什么这段代码中传递的引用不起作用?

Java RMI 与 JFrame - 从客户端获取文本到 GUI

java RMI - 服务器自动调用远程方法

用于远程IP(主机)的Java RMI

java - 尝试使用tomcat在servlet中加载dll时出现NoClassDefFoundError

java - 使用同一对象更改数组的值

java - 编写这些java数组的最佳方法是什么?

java - javafx 独立应用程序中的 RMI 连接

java - 尝试生成 stub 文件时出错