在 != 机器上使用时创建连接时发生 Java RMI 异常

标签 java callback rmi

我已经在 RMI 问题上苦苦挣扎了几个小时。目前这是一个非常愚蠢的例子,只有当我在同一台计算机上启动客户端和服务器时才有效。当我在 != 机器上启动客户端 ^ 服务器时,当服务器尝试调用回调时,我会收到异常:

Exception creating connection to: 192.168.244.1; nested exception is: 
java.net.SocketException: Network is unreachable
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:632)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128)

顺便说一句,这没有任何意义,因为我位于 10.0.0.x 子网中,这个 IP 来自哪里?

该代码由服务器和客户端两个类组成,实现两个{Server|Client}接口(interface)。我从 RMIRegistry 获取服务器对象并调用登录方法没有问题。我可以通过服务器端的断点看到代码已执行,但是一旦到达回调指令,它就会失败。顺便说一句,异常(exception)是客户端。

我尝试在两台计算机上禁用防火墙,但没有成功。我怀疑问题出在异常发送给我的ip上,但我不知道它来自哪里。

下面是代码: (客户端.java)

public class Client extends UnicastRemoteObject implements ClientInterface {

    public static void main(String[] args) {
        try {
            new Client();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        }
    }

    public Client() throws RemoteException, MalformedURLException, NotBoundException {
        ServerInterface s = null;
        s = (ServerInterface) Naming.lookup("rmi://10.0.0.48/server");
        s.login(this);
    }

    @Override
    public void talk() throws RemoteException {
        System.out.println("Talkiiiing");
    }
}

(ClientInterface.java)

public interface ClientInterface extends Remote {
    void talk() throws RemoteException;;
}

(服务器.java)

public class Server extends UnicastRemoteObject implements ServerInterface {

    public Server() throws RemoteException, MalformedURLException {
        LocateRegistry.createRegistry(1099);
        if (System.getSecurityManager() == null)
            System.setSecurityManager(new RMISecurityManager());
        Naming.rebind("rmi://localhost:1099/server", this);
    }

    public static void main(String[] args) {
        try {
            new Server();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void login(ClientInterface clientInterface) throws RemoteException {
        clientInterface.talk();
    }
}

最后是(ServerInterface.java)

public interface ServerInterface extends Remote {
    void login(ClientInterface clientInterface)  throws RemoteException;
}

最佳答案

这是典型的 java.rmi.server.hostname 问题。请参阅item A.1 in the RMI FAQ 。您需要将服务器 JVM 上的 java.rmi.server.hostname 设置为您希望客户端在连接时使用的地址。该问题是由 DNS 配置错误引起的:也许您可以在那里修复它:如果可以的话更好。 “localhost”应解析为 127.0.0.1,您的主机名应解析为您的真实 IP 地址。

关于在 != 机器上使用时创建连接时发生 Java RMI 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12785129/

相关文章:

java - JBoss RMI 事务

Java 手动客户端证书身份验证

java - JBoss Seam - @In 注释不能与不同属性的访问器方法同时使用吗?

java - 添加log4J库到构建路径失败?

javascript - 将数据从 child 传递给 parent React Hooks

Java JSSE RMI SSL 文件被拒绝访问

java - 如何使用 Neo4j 和 spring 数据返回多个对象?

c# - 如何通过 C++-CLI 回调和委托(delegate)将字符串从 C++-CLI 传递到 C#

ruby-on-rails - rails/ ruby : Self-referential association using dependent: :destroy causing duplicate callbacks

Java 数组列表/RMI