我有一个 java rmi 应用程序,我只是这样做:
客户:
Registry registry = LocateRegistry.getRegistry("localhost");
costApi = (CostApi) registry.lookup("server.CostApi");
当我在本地主机上托管服务器时一切正常。当我在本地网络的另一台机器上启动相同的程序时,在 192.168.x.x 并更改为:
客户:
Registry registry = LocateRegistry.getRegistry("192.168.x.x");
costApi = (CostApi) registry.lookup("server.CostApi");
它不再工作并且失败并出现一个非常奇怪的错误:
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy0.dataCost(Unknown Source)
at billing.data.DataBiller.performBilling(DataBiller.java:57)
at billing.data.DataBiller.consumeMessage(DataBiller.java:46)
at general.templates.RabbitWorker.run(RabbitWorker.java:124)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
我什至没有尝试连接到 127.0.1.1,而是连接到 192.168.x.x,我该如何解决这个问题?我更喜欢只使用 java 代码,而不是用配置文件修改我的机器。我正在使用 Linux
最佳答案
这通常是由配置错误引起的。检查您的 /etc/hosts
文件以确保:
- 本地主机映射到 127.0.0.1
- 您的真实主机名映射到您的真实主机地址
众所周知,一些 Linux 发行版将此放在前面。
如果问题仍然存在,请尝试将服务器上的 java.rmi.server.hostname
设置为客户端在执行远程方法调用时应使用的 IP 地址。它需要在导出任何远程对象(包括注册表)之前进行设置。
问题是由 stub 中嵌入的 IP 地址引起的,它最终来自像 InetAddress.getLocalAddress(),
这样的东西,它和上面一样是容易出错的。它被 java.rmi.server.hostname.
这是 item A.1 in the FMI FAQ ,但请注意该项目的标题有误。它不会在 lookup()
期间发生,它会在您对生成的 stub 调用远程方法时发生。
关于java - 为什么java rmi一直连接到127.0.1.1。什么时候ip是192.168.X.X?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23478649/