我试图让两个Java进程通过RMI一起交谈。在2016年。在Java 8上。
我感觉事情已经发生了变化,但我是一个老式的家伙,并希望坚持普通的RMI。大多数在线文档都过时了。其余部分介于RMI框架的各种变化之间。我们目前在线: -
通过rmic的原始存根/骨架方法
动态生成的存根文件发布在Java 4
对JDK 7 Update 21中的codebase参数的更改
提及此tutorial
我有一个client.class和一个server.class,每个都在不同的物理机器上。我不确定是否需要运行独立的HTTP服务器(例如Apache httpd)来提供存根文件供客户端下载。这似乎是codebase参数的重点。这对我来说似乎也是多余的,但并不是因为动态生成的存根文件归因于RMI注册表程序。如果我必须运行httpd,这是否也嘲弄拥有全Java解决方案?您将从Web主目录提供哪些文件?它是server.class的第二个副本,而不是导出到RMI注册表的副本吗?这一切似乎都是一个混乱的文档 - 盟友。
机器加载RMI所需的Web服务器是什么?
答案 0 :(得分:1)
机器加载RMI所需的Web服务器是什么?
NO。您 特别需要网络服务器。只是服务器机器(具有远程对象帮助实现远程接口的机器)应该从客户端机器可见(可被发现)(机器调用方法)。
我已经构建了多个客户端 - 服务器应用程序和分布式计算应用程序,其中唯一的事情是使调用者基本上可以发现被调用者。就像应用程序在本地网络中运行一样,只需配置/etc/hosts
文件就能为我完成工作。
我有一个client.class和一个server.class,每个都在不同的物理上 机器。我不确定是否需要运行独立的HTTP 服务器(如Apache httpd)提供存根文件供下载 由客户。
NO。上面已经说明了。
如果我这样做,这也不会嘲弄拥有全Java解决方案 必须运行httpd?您将从Web主页提供哪些文件 目录?它是server.class的第二个副本,而不是那个副本 导出到RMI注册表?
对于在网络中运行的简单客户端 - 服务器应用程序(简单的非Web应用程序),您不需要任何Web目录。
远程对象的存根充当客户端的本地代表或远程对象的代理。调用者在本地存根上调用一个方法,该方法负责对远程对象执行方法调用。在远程JVM中,每个远程对象可能具有相应的骨架(在Java 2平台环境中,不需要骨架)。骨架负责将调用分派给实际的远程对象实现。有关Java RMI体系结构的详细信息,请阅读this链接。
无需下载额外文件即可实现此目的。
答案 1 :(得分:1)
您可以在没有代码库功能的情况下使用RMI。这不是强制性的。
它不仅可以访问存根,还可以访问客户端可能不知道的任何其他服务器端类:例如,如果指定远程方法返回接口或抽象类,代码库功能可用于部署返回值的实际实现。这允许更新实现类,而不会导致大量客户端部署问题。它应该被视为部署解决方案,而不是RMI的组成部分。
我是一个老式的家伙,我想坚持使用普通的RMI。大多数在线文档都过时了。
没有太大变化。 1.5中的动态存根,1.7中的代码库调整,1.2以后没有其他主要内容。
我不确定是否需要运行独立的HTTP服务器(例如Apache httpd)来提供存根文件供客户端下载。
你不是。见上文。
这似乎是codebase参数的重点。这对我来说似乎也是多余的,但并不是动态生成的存根文件归因于RMI注册表程序。
只有您认为代码库功能仅适用于存根,但它不是:见上文。您甚至可以在反向使用它,从客户端到服务器,用于接口的实现类或用作远程方法参数的抽象类。
如果我必须运行httpd,这还会嘲弄拥有全Java解决方案吗?
没人说你必须运行HTTPD,甚至是HTTP服务器。例如,它可以是FTP。它可以是用Java实现的HTTP服务器。很多可能性。或者您根本无法使用该功能。
您将从Web主目录中提供哪些文件?它是server.class的第二个副本吗?
没有。为什么?客户端不需要server.class。
不是导出到RMI注册表的那个?
那也不是server.class,它是存根。
这一切似乎都是一个混乱的文档 - 盟友。
我不同意。以上没有任何猜测出现在文档中。
机器加载RMI所需的Web服务器是什么?
没有