java - 当客户端机器有多个 IP 地址时,RMI 服务器到客户端的调用失败

标签 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]) 以获取我将调用的服务器 stub serverRef,然后调用serverRef.registerClient(this)。问题发生在服务器的 registerClient(Client c) 方法的第一行。

问题

当服务器在 registerClient 方法中对 Client 进行第一次远程方法调用时,将抛出 RemoteException。虽然客户端和服务器机器在同一个子网上,但客户端的机器有一个辅助 IP 地址。所以 IP 看起来像这样:

服务器机器 IP:123.45.67.1
客户端机器 IP:123.45.67.2192.168.67.2

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

有什么方法可以“告诉”服务器端 RMI 在打开到新的客户端对象 stub 的连接时连接到哪个 IP 地址?

最佳答案

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

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

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

    -Djava.rmi.server.hostname=ip_address

  • 等等

查看此链接:

这些链接也很有用:

关于java - 当客户端机器有多个 IP 地址时,RMI 服务器到客户端的调用失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10354758/

相关文章:

Java/XML请求问题

java - 连接到位于防火墙后面的 RMI 服务器?

java - 持续轮询,还是 Java RMI?

java - RMI URL 格式之间的区别

java - 客户端收到未声明的已检查异常,但已声明异常被捕获

php - android-php-mysql : json + rmi

java - Spring Integration ErrorMessage 中的 null originalMessage

java - 您可以从 Java 调用 OpenSSL 的哈希原语吗?

java - 取消后延迟处理程序/可运行的暂停/等待,并仍然激活暂停的代码

java - 内容解析器 - 添加新的非本地日历 - 进程结束时删除日历