[英]RMI Server to Client call fails when Client machine has more than one IP Address
首先,我想为这个问题发布一些真实的代码,但我不能,因为它太多了。 那就是说,这是我的情况:
服务器端
我有一个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)
方法的第一行。
问题
当服务器在registerClient
方法内对Client
进行第一次远程方法调用时,抛出RemoteException。 当客户端和服务器计算机位于同一子网上时,客户端的计算机具有辅助IP地址。 所以IP看起来像这样:
服务器机器IP:
, 客户机IP地址
在服务器的第一次远程回调期间抛出的RemoteException指示服务器正在尝试连接到客户端的192.168.67.2地址,这是导致失败的原因。 服务器应该尝试连接到123.45.67.1地址。 我知道禁用属于第二个IP地址的网络接口可以解决问题,但这对我来说不是一个真正的选择。
在打开与新客户端对象存根的连接时,有没有办法“告诉”服务器端RMI连接哪个IP地址?
有几种可能的解决方案,包括
编写自定义客户端套接字工厂
在java.rmi.server.hostname属性中指定地址
-Djava.rmi.server.hostname=ip_address
等等
看看这个链接:
这些链接也很有用:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.