【问题标题】:RMI connection with wifi and dialup internet与 wifi 和拨号互联网的 RMI 连接
【发布时间】:2014-06-17 13:18:55
【问题描述】:

我使用 rmi 创建了一个简单的数据库应用程序。它适用于我的本地无线网络。但现在我想通过互联网将我的客户端连接到服务器。我知道,这可以通过在路由器中设置端口转发来实现。但我希望它可以在任何使用 wifi 连接、拨号连接到互联网的计算机上工作 连接等。如何做到这一点? 在这里写什么? Naming.lookup("rmi://?????????????"); 由于我对java很陌生,请用一个简单的代码示例给我一个详细的答案。 提前致谢

【问题讨论】:

  • 您的问题不清楚,但我假设英语不是您的第一语言。 Java RMI 通常位于TCP port 1099。由于 RMI 在TCP 上,您的问题就变成了Internet routing work 怎么样?
  • 我建议你改用 http-invoker 或 hessian 而不是 RMI。如果您使用的是弹簧,则非常简单。 Http-invoker 在 80 或 443 端口上通过 http/https 工作,通常不需要在服务器和客户端上进行额外的防火墙设置。

标签: java rmi distributed-computing


【解决方案1】:

我希望您对 Java RMI 概念感到困惑。具有讽刺意味的是,几天前我也在想同样的想法,只是我想连接我的内部网络。

在 Java RMI 中可以使用两种类。

远程类是其实例可以远程使用的类。一个东西 可以通过两种不同的方式引用这样的类: 1. 在构造对象的地址空间内,对象是一个普通对象,可以像任何其他对象一样使用。 2. 在其他地址空间内,可以使用对象句柄来引用对象。虽然人们如何使用 对象句柄与对象相比,在大多数情况下可以使用 对象的处理方式与普通对象相同。

Serializable 类的实例可以从一个类中复制 地址空间到另一个。 Serializable 类的实例将是 称为可序列化对象。换句话说,一个可序列化的对象是 一种可以编组的。

所以,这里是您问题的答案,假设您在不同的系统(服务器)上谈论远程课程。

远程对象的名称包括以下信息:

正在运行的计算机的 Internet 名称(或地址) 注册远程对象的对象注册表。如果 对象注册表与正在运行的机器在同一台机器上运行 发出请求,那么机器的名称可以省略。

对象注册表正在侦听的端口。如果对象 注册表正在监听默认端口,1099,那么这不会 必须包含在名称中。

对象注册表中远程对象的本地名称。

使用通常的主机、端口和名称指定远程对象的 URL:

rmi://host:port/name

host = 注册表的主机名(默认为当前主机) port = 注册表端口号(默认为注册表端口号) name = 远程对象的名称

假设您的代码位于主机名为“XYZ.edu/home/CLasses”的服务器上(您可以提供服务器的 DNS/IP 地址并包括类文件的位置),端口- number="1099"(默认)和远程对象的名称="abc" 用于服务器中的 ABC.java 类。这样一来,就可以从不同的机器调用远程对象。此外,您需要将整个服务器代码保留在 Internet 地址上,以便客户端可以从 Internet 访问它们(无法访问您机器中存在的离线代码)。只有这样才能发生!!!

这是示例客户端程序:

/**
* Client program for the "Hello, world!" example.
* @param argv The command line arguments which are ignored.
*/
public static void main (String[] argv) {
try {
  HelloInterface hello = 
    (HelloInterface) Naming.lookup ("//ortles.ccs.neu.edu/Hello");   //see here the address of the server hosting the Server file,you can omit port number,it'll take default port 1099.
  System.out.println (hello.say());
 } catch (Exception e) {
  System.out.println ("HelloClient exception: " + e);
 }
}

【讨论】:

  • 根据您的说法,无法通过互联网连接,但我已使用我的无线网络连接,其中服务器在一台计算机上运行,​​客户端在另一台计算机上运行,​​所以为什么不能可以通过互联网吗?归根结底,互联网就是一个网络!
  • @user3641302-你误解了我的回答,我没有这么说。当然,您可以使用 Internet 进行操作。但是,您需要将服务器文件驻留在服务器 IP 地址上,然后才能使用远程对象作为客户端连接到它们。您所取得的成就是我已经提到的,我也尝试过,并且成功了。您需要服务器 IP 地址来连接以访问 bind()rebind() 的源文件。请再看一遍答案!
  • 显然,您需要在某个IP地址托管文件,并不是您可以直接连接。你是如何在你的个人网络中连接它的?您是如何使用 WiFi 设置将其连接到本地服务器的?请解释一下,以便我可以向您解释其余部分并消除您的疑问!!!
  • 我在我的客户端应用程序中使用了运行服务器的计算机的IP地址,(“rmi://服务器计算机的IP地址:1099/Hello”);问题是当我使用服务器计算机的公共 IP 地址时,我无法连接。正如我所说,我对编程很陌生,所以请给我一些详细的答案。Tnx
  • 我得到的异常是 java.rmi.ConnectException: Connection denied to host:ip address.Nested exception is ava.net.ConnectException: Connection timed out: connect.
最近更新 更多