javarmi:如何通过POJO

javarmi:如何通过POJO,java,rmi,pojo,Java,Rmi,Pojo,我成功地创建了RMI服务和客户端。我可以调用方法等等。但现在我想尝试以下方法:我想在服务上托管一个标准Java对象,比如LinkedList。 另外,我想“假装”我已经有了使用LinkedList的现有代码。我想要的是得到一个实际上由服务管理的LinkedList,但是我可以像访问普通LinkedList一样在本地访问它。除此之外,我还想做一些简单的日志记录,比如如果调用.add(),它会在服务器上写:“add called” 这不是为了生产,只是为了帮助我了解它是如何工作的 到目前为止,我已经

我成功地创建了RMI服务和客户端。我可以调用方法等等。但现在我想尝试以下方法:我想在服务上托管一个标准Java对象,比如LinkedList。 另外,我想“假装”我已经有了使用LinkedList的现有代码。我想要的是得到一个实际上由服务管理的LinkedList,但是我可以像访问普通LinkedList一样在本地访问它。除此之外,我还想做一些简单的日志记录,比如如果调用.add(),它会在服务器上写:“add called”

这不是为了生产,只是为了帮助我了解它是如何工作的

到目前为止,我已经尝试了很多东西。最有希望的是,我创建了一个扩展LinkedList并实现远程的类。此类尝试在构造函数中的注册表中注册自身,如下所示:


试一试{

exportObject((远程)this); Naming.rebind(“theList”,(Remote)this); } 捕获(例外e){ 系统输出打印项次(“失败”); System.out.println(e.getMessage()); }

我必须这样做,因为我需要扩展LinkedList,因此我无法扩展UnicastRemoteObject

尝试在服务器端运行此操作时获得的输出:

fail Connection refused to host: 192.168.178.27; nested exception is: java.net.ConnectException: Connection refused 失败 拒绝主机连接:192.168.178.27;嵌套异常是: java.net.ConnectException:连接被拒绝 在客户端:

java.lang.ClassCastException: MyList_Stub cannot be cast to java.util.LinkedList at $Proxy0.createList(Unknown Source) at RemoteProgram.main(RemoteProgram.java:27) java.lang.ClassCastException:MyList_存根不能强制转换为java.util.LinkedList 位于$Proxy0.createList(未知源) 位于RemoteProgram.main(RemoteProgram.java:27)
提前谢谢

你想做的事情效率很低,不是一个好主意。基本上,您可以在方法调用中发送任何可以序列化的内容。如果您想要良好的性能,我建议您只有一个远程对象来表示您的服务,并充当您需要的所有服务的门面(每个远程对象都会产生单独的文件描述符,因此拥有大量远程对象通常不是一个好主意)。此外,如果您经常添加和删除对象,那么每次添加或删除元素时发送消息实际上是不明智的。我建议使用以下两种非常简单的方法创建一个远程对象:

LinkedList retrieveLinkedListByName(String);
boolean commitNewVersionOfLinkedListByName(String,LinkedList);

在应用程序启动时,您可以下载链接列表,然后定期在应用程序退出时发回链接列表。这应该比每次在链接列表中添加或删除元素时使用网络更有效。只要LinkedList的元素是可序列化的,你就不需要为它的发送做任何魔术(比如扩展remote)。

你试图做的事情效率很低,也不是一个好主意。基本上,您可以在方法调用中发送任何可以序列化的内容。如果您想要良好的性能,我建议您只有一个远程对象来表示您的服务,并充当您需要的所有服务的门面(每个远程对象都会产生单独的文件描述符,因此拥有大量远程对象通常不是一个好主意)。此外,如果您经常添加和删除对象,那么每次添加或删除元素时发送消息实际上是不明智的。我建议使用以下两种非常简单的方法创建一个远程对象:

LinkedList retrieveLinkedListByName(String);
boolean commitNewVersionOfLinkedListByName(String,LinkedList);
java.lang.ClassCastException: MyList_Stub cannot be cast to java.util.LinkedList
at $Proxy0.createList(Unknown Source)
at RemoteProgram.main(RemoteProgram.java:27)
在应用程序启动时,您可以下载链接列表,然后定期在应用程序退出时发回链接列表。这应该比每次在链接列表中添加或删除元素时使用网络更有效。只要LinkedList的元素是可序列化的,就不需要为它的发送做任何魔术(比如扩展remote)

java.lang.ClassCastException: MyList_Stub cannot be cast to java.util.LinkedList
at $Proxy0.createList(Unknown Source)
at RemoteProgram.main(RemoteProgram.java:27)
LinkedList是一个具体的类,RMI与接口一起工作,因此您应该在客户端强制转换到List接口


LinkedList是一个具体的类,RMI使用接口,因此您应该在客户端强制转换到列表接口。

同意其他海报,这是一个非常低效的设计


至于您的例外情况,我不知道如何在服务器中获得“拒绝连接”并仍然能够运行客户端。您需要发布堆栈跟踪。

同意其他海报,这是一个非常低效的设计


至于您的例外情况,我不知道如何在服务器中获得“拒绝连接”并仍然能够运行客户端。您需要发布堆栈跟踪。

…对于拒绝连接的异常,我将首先查看您正在使用的安全策略(假设没有防火墙等外部问题)…对于拒绝连接的异常,我将首先查看您正在使用的安全策略(假设没有防火墙等外部问题).嘿,迈克尔,谢谢你的回复。但我只是想理解这些概念。我指定的方式-您将如何进行,以便每次更改内容时都将其传输到服务器,尽管效率非常低?嘿,Michael,谢谢您的回复。但我只是想理解这些概念。按照我指定的方式—您将如何进行操作,以便每次更改某些内容时都将其传输到服务器,尽管效率非常低?