1

RMI を使用するクライアント/サーバー アプリケーションを作成しています。クライアントの接続を受け入れることができる不変のアドレスを取得するために、dyndns を使用します。しかし、次のエラーが表示されるため、サーバーでバインド操作を実行する際に問題があります: 接続が拒否されました: 接続

私はこの方法でバインド操作を行います:

MultiServer multi = new MultiServer(); // creates an instance of the remote object
LocateRegistry.createRegistry(port);
Naming.bind("//my_host_address.dyndns.org:my_port/MultiServer", multi);

何を設定する必要がありますか? 使用するポートを開き、dyndns サービスを正しく構成しました (ソケットで使用するため、確実です)。

編集:

実際、私は自分のサーバーで次のようなことをしています:

 //other code
 MultiServer multi = new MultiServer();
 System.setProperty("java.rmi.server.hostname", "hostname.dyndns.org");
 LocateRegistry.createRegistry(2367); // the server will listen on port 2367
 Naming.bind("//localhost:2367/MultiServer", multi);

それは十分ですか?または、クライアントに他の情報を指定する必要がありますか? クライアント側では、これを行うだけです:

 IRemoteServer remote = (IRemoteServer)Naming.lookup("rmi://hostname.dyndns.org:2367/MultiServer");

この指示の後、私は通常、リモート インターフェイスによって公開されたメソッドを使用します。

しかし、次の手順に従うと、次のエラー メッセージが表示されます。

Connection refused to host: **SERVER_INTERNAL_IP**; nested exception is: 
java.net.ConnectException: Connection timed out: connect

クライアントがDNSホストアドレスを解決するときに、サーバーの実際のIPではなく、サーバーの内部IPアドレスを指すようにするにはどうすればよいですか?

EDIT2:クライアントはサーバーを検索できますが、リモートメソッドを呼び出すことができず、クライアントからリモートメソッドを呼び出そうとすると正確に例外が発生することに気付きました。

4

2 に答える 2

0

バインド、再バインド、またはバインド解除するときは、'localhost' を使用してください。とにかくローカルホストのレジストリにしかバインドできないので、他のものを使用する必要はありません。

ただし、デフォルトでは、ホストの IP アドレスはスタブに埋め込まれており、IP アドレスが変更された場合にスタブが魔法のように変更されることはありません。「dyndns」ホスト名をスタブに設定する必要がありますjava.rmi.server.hostname.

于 2013-07-22T21:43:17.203 に答える
0

次のようにサーバーを実行してみてください。
java -Djava.rmi.server.hostname=yourserver.dyndns.org -Djava.security.policy=yourPolicy.txt -cp 'yourjar.jar' yourServerClass

于 2015-06-06T20:29:18.423 に答える