Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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
Java RMI远程对象强制转换/状态_Java_Rmi - Fatal编程技术网

Java RMI远程对象强制转换/状态

Java RMI远程对象强制转换/状态,java,rmi,Java,Rmi,我有一个RMI应用程序,详细信息如下。服务器知道它正在创建DocumentProvider对象,并使用Document接口将对该对象的引用传递给客户端。当客户机将文档对象传递给服务器时,服务器无法再将其转换为DocumentProvider,尽管这是服务器最初创建的 是否有一种方法可以进行这种类型的转换,即服务器知道它正在创建一个具有更多内部功能的文档的特定实现(在本例中为InternalClass serverInfo),并希望在其文档函数的实现中访问这些附加功能(在本例中为“doCast()

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

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

另一种提问方式:一旦服务器创建了DocumentProvider对象,该对象是否位于服务器上?如果是这样,我怎样才能给客户一个参考呢?内部类serverInfo;部件不可序列化,无法传输到客户端。(有点像文件句柄等,不过我可以在DocumentProvider类中保存和管理它)


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

远程对象作为存根传递和返回,这些存根实现相同的远程接口。因此,强制转换到实际的远程对象类是不可能工作的,而尝试远程执行该操作就更没有意义了。只需将存根用作接口的实例。如果这还不够,那么您的设计就有问题。

远程对象作为存根传递和返回,这些存根实现了相同的远程接口。因此,强制转换到实际的远程对象类是不可能工作的,而尝试远程执行该操作就更没有意义了。只需将存根用作接口的实例。如果这还不够,那么您的设计就有问题。

详细说明,“InternalClass serverInfo”是一个不可序列化的第三方“句柄”,我必须以某种方式将其状态保留在服务器中,因此主要问题是如何做到这一点,同时返回对远程对象的引用,允许客户端“操纵”通过接口中定义的远程调用创建内部对象。(另一个简单的例子:如果serverInfo是一个文件句柄,我允许客户端通过文档接口执行“查找”和“读取”功能)@Mary InternalClass serverInfo与此无关。问题在于文档和文档提供者。“d”不可能成为doCast主体中的文档提供者。它作为实现文档的远程存根接收。实际上,它是由客户端通过这种方式从createDocument()接收的。客户不需要或不应该需要DocumentProvider。它应该满足于文档。如果不是,则说明您的设计有问题,我是否可以将DocumentProvider传递给客户端,并将其作为服务器中的参数接收?(答案似乎是“否”,传递的是存根)。这又回到了最初的目标,将远程“句柄”传递给客户端;更复杂的设计是创建一个整数句柄池,并将服务器对象存储在数组或键值存储中,将整数句柄传递给客户端。@无论您向客户端馈送什么,都必须是导出的远程对象,客户端将接收该对象作为实现相同远程接口的存根,或可序列化对象,客户端将接收该对象作为其自身的副本。客户端永远不会得到的是远程对象本身。那么这是否正确:底层(有状态)对象位于服务器上,存根可以自由地传递给其他JVM,存根可以正确地找到并调用此对象及其方法,但是如果我们将存根传递给服务器,服务器无法将该存根映射到基础对象(位于同一服务器中)。[Whewwww!那真是太好了]详细地说,“InternalClass serverInfo”是一个不可序列化的第三方“句柄”,我必须以某种方式将其状态保留在服务器中,所以主要问题是如何做到这一点,同时返回对远程对象的引用,允许客户端“操纵”通过接口中定义的远程调用创建内部对象。(另一个简单的例子:如果serverInfo是一个文件句柄,我允许客户端通过文档接口执行“查找”和“读取”功能)@Mary InternalClass serverInfo与此无关。问题在于文档和文档提供者。“d”不可能成为doCast主体中的文档提供者。它作为实现文档的远程存根接收。实际上,它是由客户端通过这种方式从createDocument()接收的。客户不需要或不应该需要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
}