web-dev-qa-db-ja.com

Java RMI接続例外:ホストへの接続拒否/タイムアウト

私はRMIコマンドラインゲームに取り組んでいますが、サービスを実行しようとすると、次のようなエラーが表示されます。

Java.rmi.ConnectException: Connection refused to Host: 192.168.56.1; nested exception is: 
    Java.net.ConnectException: Connection timed out: connect

これは私のServerのメインクラスです。

public class RMIWar {

    public static void main(String[] args) throws RemoteException, MalformedURLException  {
        try {
            Controle obj = new Controle(4);
            Registry reg = LocateRegistry.createRegistry(1099);
            System.out.println("Server is ready");
            reg.rebind("CtrlServ", obj);
        }
        catch (Exception e) {
            System.out.println("Error: " + e.toString());
        }
    }
}

私のClientクラスのメイン:

public class RMIWarClient {
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException  {
        try {
            Registry registry = LocateRegistry.getRegistry("localhost");
            ControleInt ctrl = (ControleInt) registry.lookup("CtrlServ");
            System.out.println("CtrlServ found...\n");
            BioRMI bio = new BioRMI(null, 5,5,5);
            ctrl.thRegister("Test", bio.atk, bio.def, bio.agi);

        }

        catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }
}

助言がありますか?

9

1099ポートが使用可能かどうか(つまり、ファイアウォールによってブロックされているかどうか)をテストします。また、使用しているOSや、サーバーを実行する前にレジストリを起動したかどうかについても言及していませんでした。

このRMI チュートリアル は、次のことを説明しています。

Compute Engineを起動する前に、RMIレジストリを起動する必要があります。 RMIレジストリーは、リモート・クライアントが初期リモート・オブジェクトへの参照を取得できるようにする単純なサーバー・サイドbootstrap命名機能です。

デフォルトでは、レジストリはあなたと同じようにポート1099で実行されます。チュートリアルが報告するように、コマンドプロンプト(Windowsの場合)またはシェルターミナル(UNIXのようなOSの場合)を開き、次のように入力します。

Windowsの場合(起動できない場合はjavawを使用):

start rmiregistry

Solaris OSまたはLinux

rmiregistry &

[〜#〜]更新[〜#〜]

Oracleのチュートリアルと昔の私のプロジェクトに従って、Serverクラスでは、オブジェクトをRMIランタイムにエクスポートしていないことに気付きました。次に、これらの行を編集する必要があります。

Controle obj = new Controle(4);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", obj);

に:

Controle obj = new Controle(4);
Controle stub = (Controle) UnicastRemoteObject.exportObject(obj, 0);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", stub);

チュートリアルが報告するので:

静的なUnicastRemoteObject.exportObjectメソッドは、提供されたリモートオブジェクトをエクスポートして、リモートクライアントからリモートメソッドの呼び出しを受信できるようにします。

また、RMI呼び出しに同じホストを使用している場合、Clientクラスでは必要ありません。

Registry registry = LocateRegistry.getRegistry("localhost");

単に呼び出す:

Registry registry = LocateRegistry.getRegistry();

オラクルが報告するのは:

LocateRegistry.getRegistryの引数なしのオーバーロードは、ローカルホストとデフォルトのレジストリポート1099のレジストリへの参照を合成します。レジストリが1099以外のポートで作成されている場合は、intパラメーターを持つオーバーロードを使用する必要があります。

11
Alberto Solano

ファイアウォールでブロックされる可能性があるため、ポートに注意してください。たとえば、職場や大学などの安全な場所で作業している場合、管理者がいくつかの保護を実装している可能性があります...

0
melli-182

ここに私の解決策を記述しました Java.rmi.ConnectException:接続はホストに拒否されました:127.0.1.1; そしてここ Java6のjconsoleを介してTomcatのMBeanServerに接続できません 。問題は基本的なネットワークの問題でしたが、他の誰かに起こる可能性があります。

0
Paul

私はあなたがそのコードからその例外をどのように得ることができるのか分かりません。コードによると、サーバーとクライアントは同じホスト上で実行されており、同じホスト内で接続タイムアウトは発生しません。

したがって、それが実際のコードではなく、正しいレジストリ(getRegistry()へのホスト引数)を検索していると仮定すると、ネットワークトポロジで192.168.56.1がIPアドレスとして表示されるかどうかを確認します。これは内部LANアドレスであり、クライアントがLANの外部にある場合は、よりパブリックなIPアドレスに接続しようとしているはずです。アドレスが期待したものと異なる場合は RMI FAQの項目A.1 を参照してください。

0
user207421