通过互联网发送对象并调用它的方法

时间:2016-08-06 09:17:08

标签: java object

我有一个java Web服务器,我做了它,以便服务器通过发回一个包含“执行”方法的java对象来响应某个http *请求。

我希望能够执行远程对象的方法。

  • 我不能使用反射,因为我不发送类,考虑创建一个具有相同方法+ package-name的本地类,所以我可以尝试object.getClass()

  • 我不想将整个代码块放在我要发送的对象的toString()中。 (覆盖)

  • 我无法转换为界面。

我也在考虑创建一个.jar库,它具有将在服务器上创建并在客户端上访问的类文件的定义,这怎么可以工作?

我找不到有关此问题的另一个问题,所以我将把它留在这里。

编辑:

  • 我正在使用URLConnection与servlet通信,servlet在服务器上创建对象的实例然后它将使用ObjectOutputStream将其发送到客户端,以及客户端上的ObjectInputStream以获取它它

  • 寻找RMI的一些替代方案,如果没有,我会查找一些RMI教程。

  • 关于我选择不首先使用RMI:也许我不希望每次都在客户端服务器之间建立连接,也许我想反序列化对象并检查/调用它的方法。 / p>

1 个答案:

答案 0 :(得分:2)

如果你要去"发送"从一个java虚拟机(java进程)到另一个java虚拟机的序列化对象,你需要在两端都有.class文件。如果您决定继续使用当前的方法,则需要以下内容:

  • 您的客户端必须是Java,或者能够运行Java,并且具有与本地接收的对象相对应的.class文件,或者必须在访问它们之前从服务器下载它们。

  • 您必须以某种方式在HTTP中包装序列化对象流。 HTTP是用于请求和发送网页的协议。它与Java的序列化协议(例如,它包含额外的头文件)不兼容,您需要将Java序列化包装在HTTP有效负载内,以使事情按预期工作。

  • 发送序列化对象时,实际上是在发送"对象图" (通过导航其字段可访问的对象和所有对象)。这最终可能效率低下。由于这个原因,序列化可能不是最佳答案。

使用其他机制要容易得多:

  • 如果您避免使用HTTP,则可以避免使用额外的包装器。编写一个简单的服务器,当连接到,接收和发送序列化对象时,比在传统Java Web应用程序中编写HTTP包装器(Java应用程序服务器往往需要资源)更容易,更有效。

  • 考虑使用Kryo或其他Java序列化/网络库 - 它们带有内置服务器,并允许对正在发送的内容进行非常细粒度的控制。

  • Java内置了对RMI的支持("远程方法调用")。这似乎是你实际想要实现的目标。您不再需要知道对象是本地对象还是远程对象 - 它们看起来工作原理相同,所有必需的网络和序列化都是在幕后完成的。阅读all about it

相关问题