首先,我想为这个问题发布一些真实的代码,但我不能,因为它太多了。那就是说,这是我的情况:
服务器端
我有一个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地址?
答案 0 :(得分:1)
有几种可能的解决方案,包括
编写自定义客户端套接字工厂
在java.rmi.server.hostname属性中指定地址
-Djava.rmi.server.hostname=ip_address
等
点击此链接:
这些链接也很有用: