我有一个java rmi应用程序,我只是这样做:
客户:
Registry registry = LocateRegistry.getRegistry("localhost");
costApi = (CostApi) registry.lookup("server.CostApi");
当我在localhost上托管服务器时,一切正常.当我在另一台具有本地网络的计算机上启动相同的程序时,在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文件以确保:
> localhost映射到127.0.0.1
>您的真实主机名映射到您的真实主机地址
众所周知,一些Linux发行版会将其重新置于前面.
如果问题仍然存在,请尝试将服务器上的java.rmi.server.hostname设置为客户端在执行远程方法调用时应使用的IP地址.在导出任何远程对象(包括注册表)之前,需要先设置它.
问题是由存根中嵌入的IP地址引起的,最终来自InetAddress.getLocalAddress(),如上所述.它被java.rmi.server.hostname覆盖.
这是item A.1 in the FMI FAQ,但请注意该项目是错误的.在lookup()期间不会发生这种情况,当您在生成的存根上调用远程方法时会发生这种情况.