【问题标题】:Connecting to a programmatically started RMI server over WAN通过 WAN 连接到以编程方式启动的 RMI 服务器
【发布时间】:2012-11-30 14:59:15
【问题描述】:

我正在尝试连接到已在远程服务器上启动的 RMI 注册表,但一段时间后出现以下异常:

java.rmi.ConnectException: Connection refused to host: *.*.*.*; nested exception is:     
java.net.ConnectException: Connection timed out

通过在服务器上本地运行客户端,一切正常,但我无法远程连接到它;甚至来自telnet。但是,如果我运行

start rmiregistry 1337

我可以从 telnet 远程连接到它。我假设这是我在运行服务器代码时必须设置的东西,但我很难找出它是什么。

这是服务器代码的一部分:

String codeBasePath = "file:/C:/*path*/build/classes";

System.setProperty("java.rmi.server.codebase", codeBasePath);
System.setProperty("java.rmi.server.hostname", *host IP*);

RemoteFileServer server = new FileServer();

Registry registry = LocateRegistry.createRegistry(PORT);

registry.bind(*name*, server);

System.out.println("Server ready");

如果您需要更多信息/代码来帮助我解决问题,请告诉我。

【问题讨论】:

  • 是否还需要设置端口属性System.setProperty("java.rmi.activation.port", PORT)?
  • 谢谢,但这也没用。
  • @mre 这里没有激活的证据,所以不需要设置激活端口。
  • @EJP 是的,为什么这很重要?我没有使用“启动注册表 1337”然后运行程序,因为它们不能都使用相同的端口。
  • 这很重要,因为 rmiregistry.exe 自己执行 LocateRegistry.createRegistry()。因此,如果您以任何一种方式启动注册表,您都应该能够通过 Telnet 访问它。所以其他的东西一定是不同的。第一个嫌疑人是港口。下一个问题是您是否真的在连接到注册表时遇到此异常,或者在尝试执行已经完成 lookup() 的远程方法时。下一个问题是异常中的地址是否是您可以远程登录的地址。

标签: java connection rmi


【解决方案1】:

好的,我能想到两个选项

1 - 您是否通过安全策略授予传入连接权限。这一步其实很简单,看这里:rmi run tutorial

2 - 端口可能已从操作系统外部关闭。例如,如果您使用的是 linux,则需要从 iptables 打开端口,例如: iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1099 -j ACCEPT iptables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 1099 -j ACCEPT 或者,如果您使用 Windows,则可以从防火墙进行配置。

有什么不清楚的可以问。

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2018-10-07
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多