1

私は数時間 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 はどこから来たのですか?

このコードは、サーバーとクライアントの 2 つのクラスで構成され、2 つの {Server|Client} インターフェイスを実装しています。RMIRegistry からサーバー オブジェクトを取得し、ログイン メソッドを呼び出すことに問題はありません。サーバー側のブレークポイントでコードが実行されていることがわかりますが、コールバック命令になるとすぐに失敗します。例外はクライアント側です。

両方のマシンでファイアウォールを無効にしようとしましたが、成功しませんでした。問題は、例外が送信した IP にあると思われますが、どこから来たのかわかりません。

次のコードは次のとおりです: (Client.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;
}
4

1 に答える 1

1

これは、典型的な java.rmi.server.hostname の問題です。RMI FAQ の項目 A.1 を参照してください。サーバー JVM の java.rmi.server.hostname を、クライアントが接続時に使用するアドレスに設定する必要があります。この問題は、DNS の設定ミスが原因です: 代わりにそこで修正できるかもしれません: できればより良いでしょう。「localhost」は 127.0.0.1 に解決され、ホスト名は実際の IP アドレスに解決されるはずです。

于 2012-10-09T00:17:01.420 に答える