細(xì)心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書(shū),跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買(mǎi)賣(mài),九十道人情。

          BlogJava 聯(lián)系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks

          RMI-IIOP入門(mén)

           

          RMI-IIOP出現(xiàn)以前,只有RMI和CORBA兩種選擇來(lái)進(jìn)行分布式程序設(shè)計(jì)。RMI-IIOP綜合了RMI
          和CORBA的優(yōu)點(diǎn),克服了他們的缺點(diǎn),使得程序員能更方便的編寫(xiě)分布式程序設(shè)計(jì),實(shí)現(xiàn)分布式計(jì)算。
          首先,RMI-IIOP綜合了RMI的簡(jiǎn)單性和CORBA的多語(yǔ)言性(兼容性),其次RMI-IIOP克服了RMI只能
          用于Java的缺點(diǎn)和CORBA的復(fù)雜性(可以不用掌握IDL).
          下面給出了一個(gè)非常的簡(jiǎn)單的RMI-IIOP程序,該程序是在上一個(gè)例子(Java2 RMI入門(mén)的基礎(chǔ))
          上修改完成的,可以對(duì)比兩個(gè)程序的區(qū)別。


          1. 實(shí)現(xiàn)遠(yuǎn)程接口,生成遠(yuǎn)程對(duì)象,存根(Stub)和框架(Skeleton)

          實(shí)現(xiàn)遠(yuǎn)程接口,遠(yuǎn)程接口告訴JVM:實(shí)現(xiàn)了該接口的對(duì)象可以遠(yuǎn)程調(diào)用及有哪些方法可以調(diào)用。
          本例子中定義了sayHello()。由于遠(yuǎn)程調(diào)用會(huì)涉及到網(wǎng)絡(luò)通訊,因此這些方法都要拋出RemoteException.
          遠(yuǎn)程接口和遠(yuǎn)程對(duì)象可以由A開(kāi)發(fā),并把遠(yuǎn)程接口(Hello)d打包分給Client端開(kāi)發(fā)者B。

          建立f:
          mi_iiop目錄,把Hello.java和HelloImpl.java拷貝到該目錄中。

          // Hello.java
          package jdeveloper.rmi;

          import java.rmi.Remote;
          import java.rmi.RemoteException;

          public interface Hello extends Remote {
          String sayHello() throws RemoteException;
          }

          生成遠(yuǎn)程對(duì)象.
          // HelloImpl.java
          package jdeveloper.rmi_iiop;

          import javax.naming.*;

          import java.rmi.RemoteException;
          import java.rmi.RMISecurityManager;
          //import java.rmi.server.UnicastRemoteObject;
          import javax.rmi.PortableRemoteObject;

          public class HelloImpl extends PortableRemoteObject
          implements Hello {
          public HelloImpl() throws RemoteException {
          super();
          }

          public String sayHello() {
          return "Hello World!";
          }

          public static void main(String args[]) {

          // Create and install a security manager
          if (System.getSecurityManager() == null) {
          System.setSecurityManager(new RMISecurityManager());
          }
          try {
          Hello obj = new HelloImpl();
          // Bind this object instance to the name "HelloServer"
          //***** old code for rmi
          // Naming.rebind("HelloServer", obj);

          //***** new code for rmi-iiop
          Context initialNamingContext = new InitialContext();
          initialNamingContext.rebind("HelloServer", obj);

          System.out.println("HelloServer bound in registry");
          } catch (Exception e) {
          System.out.println("HelloImpl err: " + e.getMessage());
          e.printStackTrace();
          }
          }
          }

          存根(Stub)和框架(Skeleton)
          f:
          cd
          mi_iiop
          set classpath=.;%classpath%
          javac -d . Hello.java
          javac -d . HelloImpl.java
          rmic -iiop -d . jdeveloper.rmi_iiop.HelloImpl
          這一步將生成<_Interface>_stub.class,<_InterfaceImpl>_Tie.class:
          _Hello_Stub.class和_HelloImpl_Tie.class


          2. 實(shí)現(xiàn)Client端程序
          // HelloClient.java
          package jdeveloper.rmi_iiop;

          import java.rmi.RMISecurityManager;
          import java.rmi.Naming;
          import java.rmi.RemoteException;
          import java.rmi.NotBoundException;

          import javax.rmi.PortableRemoteObject;
          import javax.naming.*;

          public class HelloClient {
          public static void main(String args[]) throws Exception{
          System.setSecurityManager(new RMISecurityManager());
          Context initialNamingContext = new InitialContext();
          Hello RemoteObj = (Hello) PortableRemoteObject.narrow(
          initialNamingContext.lookup("iiop://"+ args[0] +"/HelloServer"),
          Hello.class
          );
          System.out.println(RemoteObj.sayHello());
          }
          }

          把HelloClient.java拷貝到目錄f:
          mi_iiop中。
          f:
          cd
          mi_iiop
          javac -d . HelloClient.java

          3. 運(yùn)行程序
          啟動(dòng)DOS窗口
          運(yùn)行 tnameserv


          把 server.bat 和 policy 放到f:
          mi_iiop
          啟動(dòng)新的DOS窗口
          運(yùn)行 server


          啟動(dòng)新的DOS窗口
          把 client.bat 放到f:
          mi_iiop
          運(yùn)行 client hostname

          server.bat
          set CP=%classpath%
          set classpath=.;%classpath%
          java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
          -Djava.naming.provider.url=iiop://hjc:900 -Djava.security.policy=policy jdeveloper.rmi_iiop.HelloImpl
          set classpath=%CP%
          client.bat
          set CP=%classpath%
          set classpath=.;%classpath%
          java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
          -Djava.naming.provider.url=iiop://hjc:900 -Djava.security.policy=policy jdeveloper.rmi_iiop.HelloClient %1
          set classpath=%CP%
          policy
          grant {
          // Allow everything for now
          permission java.security.AllPermission;

          posted on 2007-05-06 12:33 張金鵬 閱讀(352) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 桃江县| 通化市| 麻栗坡县| 宝丰县| 安溪县| 宣城市| 福海县| 农安县| 巢湖市| 陆河县| 奇台县| 鸡东县| 洛宁县| 南靖县| 拜泉县| 尤溪县| 浮梁县| 确山县| 安康市| 泽普县| 平果县| 景德镇市| 萍乡市| 微博| 镇沅| 雷州市| 建昌县| 诸暨市| 离岛区| 修武县| 博野县| 建始县| 皮山县| 嘉祥县| 西安市| 伊通| 东山县| 德庆县| 改则县| 积石山| 广西|