首先,我很想为这个问题发布一些真实的代码,但我不能,因为它太多行了。也就是说,这是我的情况:
服务器端
我有一个 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 地址?