• 締切済み

RMIにおけるリモートサーバへの参照検索について

現在RMIを利用したサーバ/クライアント型のプログラムの勉強をしています。 通常、RMIでは、リモートクライアントがアクセスしたいリモートサーバのネーミング(rmi://ホスト名:ポート番号/サービス名・・)を知っており、 Naming.lookup(String name)を利用してリモートサーバへの参照を特定しますが、たとえば、複数のサーバでサービスが起動している場合にリモートクライアント側ですべてのサービスのネーミングを検索することは可能なのでしょうか。 文章がわかりにくくて申し訳ありません。 不明点があれば、ご指摘願います。

みんなの回答

  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.1

>すべてのサービスのネーミングを検索することは可能か というのは、複数のサーバーにRMIでアクセス出来るか?という質問でしょうか? 接続先が、例えば.propertiesファイルに記述されており、実行時にそれぞれのサーバーへアクセスするのに必要な情報が揃っていれば、基本的に何台でもOKな筈ですよ。

renann
質問者

補足

アドバイスありがとうございます。質問の意図としては、少し違います。 例えば、複数のサーバで同一のリモートサーバ(注:ここでの同一とは、モジュールとして同一という意味)を起動するとします。 話を簡単にするため、下記の項目をルール化します。 ・起動するサーバはhost01~09の9台のうちどれかとする ・公開ポートは一律1414とする ・サービス名は各サーバごとに任意に設定可能とする この状況で、クライアントアプリケーション側で下記のような処理はできるか?というのがこの質問の意図です。 <クライアントで実施したい処理> リモートサーバが起動している可能性があるホスト情報(host01~09)とリモートサーバ側のアクセスポート(1414)情報を利用して現在利用可能なサービスを取得し、サービス情報(ホスト・Port・サービス名情報)を GUIまたはコンソール上に表示させる。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 異なるOS間でRMIは利用できる?

    UNIX上にRemoteオブジェクトを作成しリモートサーバとし、windowsPCをリモートクライアントとして通信をとりたいのですがうまくいきません。異なるOS間ではたとえネットワークが確立していて、互いにRMIの手続きをとっていてもRMIは利用できないのでしょうか?それとも何か特別な設定が必要なのでしょうか?

    • ベストアンサー
    • Java
  • RMIについて

    RMIについて RMIのHelloWorldを勉強中です。 RMIを実際動かす際に事前に  RMIレジストリの起動  サーバの起動 を行いますが、 HelloWorldではなく実際RMIを使ったアプリケーションとして動かす際、 この2つのサービスはどのような方法で立ち上げるのでしょうか? Windowsのサービス(SC)に登録してもうまく動きませんでした。 (エラー1053が出力される) ちなみに環境は、RMIクライアント・サーバ共にWindowsXPです。 よろしくお願いいたします

    • ベストアンサー
    • Java
  • RMI

    http://www.ki.rim.or.jp/~kuro/Java/RMI/index.html を参考にRMIのサンプルを試みています。 サーバ:Linux クライアント:Windows2000 ■サーバ側 ・インタフェース ・リモートオブジェクトクラス ・サーバプログラムクラス ・スタブクラス ・スケルトンクラス ・セキュリティポリシーファイル ・また、/usr/binにあるrmiregistryを違うところに 退避させました。  ■クライアント側 ・クライアントプログラムファイル ・リモートオブジェクトクラス ・セキュリティポリシーファイル それぞれ、準備した後、サーバ側で、 rmiregistry & ↓ java -Djava.security.policy=rmitestpolicy -Djava.rmi.server.codebase=http://192.168.1.10/ RMITestServer とすると、 Exception in thread "main" java.lang.NoClassDefFoundError:RMITestServer とでます。Noclassといわれている、クラス、は 存在しているのですが。。。 なにか、はずしているようでしたら教えていただきたい ので,宜しくお願いします。

  • JavaのRMIで!!

    クライアントから呼び出してサーバーでhogehogeを表示させるようにこんなプログラムを書きました。 command.javaが以下の内容 import java.rmi.*; interface command extends Remote{ void comcom() throws RemoteException; } commandclient.javaが以下の内容 import java.rmi.*; public class commandclient { public static void main(String args[]) { command obj = null; try { System.setSecurityManager(new RMISecurityManager()); obj = (command)Naming.lookup("rmi://localhost/MyObject"); obj.comcom(); } catch(Exception e) { e.printStackTrace(); } } } commandserver.javaが以下の内容 import java.rmi.*; import java.rmi.server.*; public class commandserver extends UnicastRemoteObject implements command { public static void main(String args[]) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { commandserver obj = new commandserver(); Naming.rebind("MyObject", obj); } catch (Exception e) { e.printStackTrace(); } } public commandserver() throws RemoteException { } public void comcom() throws RemoteException { System.out.println("hogehoge"); } } こんなプログラムを書いてコンパイルして実行したらhogehogeが表示されるかな?と思ったら実効するとなんか意味不明なエラーがでます。これはなぜでしょうか?

  • ルータ越え環境でのRMI通信実現方法について(java-rmi.cgi取得方法)

    RMIサーバ(RMIレジストリ起動)、クライアントが異セグメント上にある場合の 通信実現方法についての質問です。 実行環境において、使用ポートに制限がかけられており、 Socketによる直接通信では、エラーが発生してしまいます。 ※ポートを全解放すると通信可能。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ java.rmi.ConnectIOException: Exception creating connection to: <RMIサーバIP> ; nested exception is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ そこで、Socketによる直接通信から、HTTPプロトコルに組み入れ、RMIサーバのポートへ直接接続 する方法を試みたところ(sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket() をオーバライドするサブクラスを作成)、今度は以下のエラーが発生してしまいました。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ サーバ上のアクセスログ、エラーログは以下の通りです。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ※アクセスログ <クライアントIP> - - [16/Dec/2007:20:25:30 +0900] "POST /cgi-bin/java-rmi.cgi?forward=3005 HTTP/1.1" 404 226 ※エラーログ [Sun Dec 16 20:25:30 2007] [error] [client クライアントIP] (2)No such file or directory: script not found or unable to stat: c:/interstage/f3fmihs/cgi-bin/java-rmi.cgi ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以上のログから、"java-rmi.cgi"スクリプトをサーバのc:/interstage/f3fmihs/cgi-binに展開すれば、通信できるのでは ないかと考えています。 SDKが提供しているものだとは思いますが、取得方法がわかりません。 取得方法について、ご教示お願い致します。 ※環境は以下の通りです。 サーバOS:Windows Server 2003(R2) Webサーバ:Interstage Application Server SE SL クライアント:WindowsXP

  • ターミナルサーバーからリモートデスクトップへの切り替え

    windows 2003 serverを利用しています。 サーバー管理用にリモートアクセスする必要があるのですが サーバー構築時に誤ってターミナルサービスをコンポーネントで追加していたようで、現在までターミナルサービスを利用してアクセスしていました。 その後試用期間が切れ、接続が出来なくなりました(下記メッセージが表示されます。) 「このコンピュータで利用できるターミナルサーバークライアントライセンスがないため、リモートセッションは切断されました」 管理用の接続なのでリモートデスクトップに戻したいのですが、 方法を教えて下さい。

  • [RMI]UnicastRemoteObject.exportObjectで毎回例外が出る

    RMIサーバ/クライアントを実験しているのですが、JDK5.0にて http://72.5.124.55/j2se/1.5.0/ja/docs/ja/guide/rmi/socketfactory/index.html や http://d.hatena.ne.jp/nowokay/20060112 にあるように、 (1)リモートオブジェクトを new (2)UnicastRemoteObject.exportObject() (3)LocateRegistry.createRegistry() (4)(3)で起動した rmiregistry に bind しようとしたのですが、(3)(4)にたどり着くまでもなく、 (2)で必ず例外(ExportException: object already exported)が出てしまいます。 具体的には以下のようなコードが私の環境では例外になってしまいます。 (便宜上内部クラスとして記述し直しています。また空白を全角にしています) =================================================================== package test; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Server {   public static void main(String[] args) throws Exception {     Server server = new Server();     server.init();   }   public void init() throws Exception {     Foo rmiObj = new FooImpl();     Foo stub = (Foo) UnicastRemoteObject.exportObject(rmiObj, 41199); //★ここで例外     LocateRegistry.createRegistry(1099);     Registry registry = LocateRegistry.getRegistry(1099);     registry.rebind("fooService", stub);   }   /* リモートインターフェース */   public interface Foo extends Remote {     public void hello() throws RemoteException;   }   public class FooImpl extends UnicastRemoteObject implements Foo {     public FooImpl() throws RemoteException {}     public void hello() throws RemoteException {       System.out.println("Hello World.");     }   } } =============================================================== ★例外 Exception in thread "main" java.rmi.server.ExportException: object already exported at sun.rmi.transport.ObjectTable.putTarget(ObjectTable.java:172) at sun.rmi.transport.Transport.exportObject(Transport.java:75) at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:196) at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:382) at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:116) at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:180) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:293) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:235) at test.Server.init(Server.java:18) at test.Server.main(Server.java:13) =============================================================== init の2行目、つまり実質 new して exportObject しようと するだけで例外になってしまうので、原因がよく分かりません。 他プロセスに起動したものが残っていたりしないか確認しましたが、 特に見受けられませんでした。 実はそのまさに2行目を抜いた状態で RMI サーバを起動しておき、 リモートオブジェクトを取ると…うまく取れてしまいました。 (ただし RMI サーバ/クライアントはともに同じローカル) が、上で挙げた情報先にあるような書き方でできないのがどうにも 気持ち悪いのです。 どこが悪いのでしょうか…

  • gethostbyaddrからリモートホストを得る仕組みを教えてください

    たとえば、IPアドレスが255.255.255.255という情報から、gethostbyaddr関数を使って、tokyo01.ppp11.***.ne.jpというリモートホストを得る仕組みを教えてください。 どうやって逆引きしてるんでしょうか? ローカルサーバーでgethostbyaddrを使うと、インターネットに接続されているときはリモートホストを返すますが、インターネットの接続を切るとリモートホストを返しません。 ネームサーバに問い合わせるのでしょうか? だとすると、どのネームサーバーが使われるのでしょうか。

    • ベストアンサー
    • CGI
  • おススメのリモートソフト

    windows7(クライアント)からXP(ホスト)にリモートや (その逆も) Windows7からwindows2000 Serverをリモートしたいんですが使いやすくてお勧めのソフトがあれば教えてもらえますでしょうか?またクライアントからサーバーの遠隔操作やNASでファイル共有等で詳しく書いている 参考書などあれば教えてください。

  • クライアントからホストWEBサーバーが見えない

    お詳しい方御教授お願いします。 ホストWEBサーバーをクライアントからアクセスするとページを参照できない場合、何が原因となるでしょうか? サーバーマシン WINXP PRO sp3 アプリ apache2.2 iIP 固定 192.168.0.4 クライアント    WINXP PRO sp3 サーバテストページにGOOGLE CHROME で参照            IP 192.168.0.51 Hostsファイルに上記 ホスト名および192.168.0.4を記述済 1.クライアントからサーバーを参照いたしますと、接続できないエラーが返ります。 2.同様にクライアントから192.168.0.1の参照はゲートウエイ(ルーターの設定画面)参照できます。 3.ホスト自身から 127.0.0.1または192.168.0.4を参照いたしますと正常に参照できます。 4.サーバーマシンのファイアーウォール設定は80番ポートオープンとなっています。 5.各マシンは同一ワークグループのメンバとなっており、互いのマシンを正常に参照できます。 6.各マシンからブラウザで外部への参照は正常に参照できます。 7.apacheのconfig設定はListen 80.User daemon、Group daemon、ServerName meiseng:80 8.apacheのhttpd-default.confはUseCanonicalName On 9.ルータのDHCPは利用しないに設定 となっています。どうかよろしくお願いします。