当客户端计算机具有多个IP地址时,RMI服务器到客户端调用失败

时间:2012-04-27 16:51:22

标签: java rmi

首先,我想为这个问题发布一些真实的代码,但我不能,因为它太多了。那就是说,这是我的情况:

服务器端

我有一个RMI服务器等待客户端连接并“自行注册”,以便服务器可以在客户端上进行函数调用。基本上,服务器有一个已发布的函数,其作用类似于以下伪代码:

public class Server extends UnicastRemoteObject implements ServerInterface{
    public Server(){ /* Server publishes itself here */ }

    ...

    /** One of many methods visible to a remote Client */
    public void registerClient(Client c) throws RemoteException{
        //1. Make some remote calls on 'c' for book-keeping purposes
        //2. Store reference to c to make calls on it later
    }
}

客户端

在启动时,客户端呼叫Naming.lookup([url])以获取我将呼叫serverRef的服务器的存根,然后调用serverRef.registerClient(this)。问题发生在服务器的registerClient(Client c)方法的第一行。

问题

当服务器对Client方法内的registerClient进行第一次远程方法调用时,抛出RemoteException。当客户端和服务器计算机位于同一子网上时,客户端的计算机具有辅助IP地址。所以IP看起来像这样:

服务器计算机IP: 123.45.67.1
客户机IP: 123.45.67.2 192.168.67.2

在服务器第一次远程回调到客户端期间抛出的RemoteException指示服务器正在尝试连接到客户端的192.168.67.2地址,这是导致失败的原因。服务器应该尝试连接到123.45.67.1地址。我知道禁用属于第二个IP地址的网络接口可以解决问题,但对我来说这不是一个真正的选择。

在打开与新客户端对象存根的连接时,有没有办法“告诉”服务器端RMI连接哪个IP地址?

1 个答案:

答案 0 :(得分:1)

有几种可能的解决方案,包括

  • 编写自定义客户端套接字工厂

  • 在java.rmi.server.hostname属性中指定地址

    -Djava.rmi.server.hostname=ip_address

点击此链接:

这些链接也很有用: