JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > CORBA編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/02/03  田中宏和
CORBA編
◆CORBAとは?
CORBAとはCommon Object Request Broker Architectureの略です。OMG(Object Management Group)が定めた分散オブジェクト技術の仕様で、これを用いることによってネットワーク上に分散しているプログラムを利用したり、相互に連動させて動かしたりすることができます。
◆ここでの環境
OS Windows 2000
J2SE SDK 1.4.0
◆OMG IDLによるインターフェース定義の作成
OMG IDLとはOMG(Object Management Group)が定めたインターフェースのを記述する言語です。IDLとはInterface Definition Languageの略です。下が今回使用するインターフェース定義です。
Hello.idl(ここからダウンロード)
module HelloApp
{
  interface Hello
  {
    string sayHello();
    oneway void shutdown();
  };
}; 
 
◆IDLファイルからJavaソースの生成
idljというコマンドで生成できます。-fallオプションを指定することによって、スタブとスケルトンのJavaソースファイルを生成できます。
コマンドプロンプト
C:\JavaHello\CORBA>idlj -fall Hello.idl

C:\JavaHello\CORBA>

これでHelloAppフォルダの下に以下のファイルが生成されます。
 
◆生成されるファイルの説明
ソースファイル 説明
HelloPOA.java サーバーのスケルトンクラス
extends org.omg.PortableServer.Servant
implements HelloApp.HelloOperations, org.omg.CORBA.portable.InvokeHandler
_HelloStub.java クライアントのスタブクラス
extends org.omg.CORBA.portable.ObjectImpl
implements HelloApp.Hello
Hello.java IDLインターフェースのJava版
extends HelloOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity
HelloOperations.java IDLで定義したsayHello()メソッドを持つインターフェース
HelloHelper.java CORBAオブジェクトを適切なタイプにキャストするために使うnarrow()メソッドを持つクラス。CORBAストリームへの書き込みと、読み込みを行うメソッドを持ち、このメソッドはHelloHolderクラスで利用される。
HelloHolder.java Helloインターフェースをパブリックメンバに持つ。CORBAストリームへの書き込みと、読み込みを行うためにHelloHeloperクラスを使用する。
implements org.omg.CORBA.portable.Streamable
◆サーバー側Javaソースファイルの作成
HelloWorldCorbaServer.java(ここからダウンロード)
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.Properties;

class HelloImpl extends HelloPOA {
  private ORB orb;

  public void setORB(ORB orb_val) {
    orb = orb_val; 
  }
  
  public String sayHello() {
    return "Hello World";
  }
  
  public void shutdown() {
    orb.shutdown(false);
  }
}

public class HelloWorldCorbaServer {

  public static void main(String args[]) {
    try{
      // ORBの生成と初期化を行います
      ORB orb = ORB.init(args, null);

      // RootPOAの参照を取得しPOAManagerを使用可能にします
      POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
      rootpoa.the_POAManager().activate();

      // サーバントを生成し、それにORBを登録します
      HelloImpl helloImpl = new HelloImpl();
      helloImpl.setORB(orb); 

      // サーバントからHelloオブジェクトの参照を取得します
      org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
      Hello href = HelloHelper.narrow(ref);
      
      // ネームサービスを検索してネームサービスの参照を取得します
      org.omg.CORBA.Object objRef =
          orb.resolve_initial_references("NameService");
      NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

      // Helloオブジェクトの参照をネームサービスに登録します
      String name = "Hello";
      NameComponent path[] = ncRef.to_name( name );
      ncRef.rebind(path, href);

      System.out.println("HelloWorldCorbaServerが起動しました");

      // クライアントからの呼び出しを待ちます
      orb.run();
    } catch (Exception e) {
      e.printStackTrace();
    }
    
    System.out.println("HelloWorldCorbaServerを停止します");
  }
}
 
 
◆クライアント側Javaソースファイルの作成
HelloWorldCorbaClient.java(ここからダウンロード)
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

public class HelloWorldCorbaClient {
  static Hello helloImpl;

  public static void main(String args[]) {
    try{
      // ORBの生成と初期化を行います
      ORB orb = ORB.init(args, null);

      // ネームサービスを検索してネームサービスの参照を取得します
      org.omg.CORBA.Object objRef = 
          orb.resolve_initial_references("NameService");
      NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

      // ネームサービスからHelloオブジェクトの参照を取得します
      String name = "Hello";
      helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
    
      // sayHello()メソッドを実行します
      System.out.println(helloImpl.sayHello());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 
 
◆コンパイル
コマンドプロンプト
C:\JavaHello\CORBA>javac *.java HelloApp\*.java

C:\JavaHello\CORBA>

◆orbdの起動
orbdはObject Request Broker Daemonの略です。ORBのデーモンプログラムで、クライアントがネームサービスの使用してオブジェクトを取得し、そのオブジェクトを利用できるようにします。コマンドライン引数にポート番号を指定します。
コマンドプロンプト
C:\>start orbd -ORBInitialPort 1050

 

正常に起動すると画面には何も表示されない状態になります。
◆サーバー側のアプリケーションの実行
コマンドプロンプト
C:\JavaHello\CORBA>java HelloWorldCorbaServer -ORBInitialPort 1050 -ORBInitialHost localhost
HelloWorldCorbaServerが起動しました
-ORBInitialPort 1050 -ORBInitialHost localhost の説明
ORBのデーモンプグラム(orbd)が動いているサーバーのポート番号とホスト名を指定します。ここではlocalhostで動いているで上記のようになります。
◆クライアント側のアプリケーションの実行
コマンドプロンプト
C:\JavaHello\CORBA>java HelloWorldCorbaClient -ORBInitialPort 1050 -ORBInitialHost localhost
Hello World

C:\JavaHello\CORBA>

おおおお!表示されましたね!
 
参考URL
http://java.sun.com/j2se/1.4/docs/guide/idl/index.html
■書籍
Java関連の書籍

 
 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME