Java2 RMI 入門

          Posted on 2006-05-26 17:16 weibogao 閱讀(302) 評論(0)  編輯  收藏 所屬分類: software development
          Java2 RMI 入門
          日 期:2004-12-30 14:36:22??出 處:原創??作 者:admin??閱 讀:128
          ?
          RMI從Java1.1開始,RMI使得運行于不同JVM(包括不同主機)上的Java應用程序可以彼此通話。
          即:一個JVM中的Java應用程序可以調用另一JVM上的對象(遠程對象)所定義的方法。
          Java RMI有著重要的意義。RMI在Java網絡編程和高級編程中都有重要的應用,如EJB, Jini等。
          Java2對RMI做了很多增強和改進,如安全性,動態代碼下載等。
          本文給出了一個最簡單的例子,以說明其中的一些基本原理。本文的特點是注重了實際開發和真正的運行
          環境相結合,模擬了RMI真正的開發和運行過程。

          1. 實現遠程接口,生成遠程對象,存根(Stub)和框架(Skeleton)

          實現遠程接口,遠程接口告訴JVM:實現了該接口的對象可以遠程調用及有哪些方法可以調用。
          本例子中定義了sayHello()。由于遠程調用會涉及到網絡通訊,因此這些方法都要拋出RemoteException.
          遠程接口和遠程對象可以由A開發,并把遠程接口(Hello)d打包分給Client端開發者B。

          建立f:\server目錄,把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;
          }

          生成遠程對象.
          // HelloImpl.java
          package jdeveloper.rmi;

          import java.rmi.Naming;
          import java.rmi.RemoteException;
          import java.rmi.RMISecurityManager;
          import java.rmi.server.UnicastRemoteObject;

          public class HelloImpl extends UnicastRemoteObject
          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"
          Naming.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 \server
          javac -d . Hello.java
          javac -d . HelloImpl.java
          rmic -d . jdeveloper.rmi.HelloImpl

          jar cvf hello.jar jdeveloper\rmi\Hello.class 把hello.jar分發給Client端的開發者B。

          存根(Stub)的存放!
          存根(Stub)是動態下載的。Client通過存根(Stub)和遠程對象的框架(Skeleton)通訊,對Client來
          講就象操作本地對象一樣。在大多數情況下,可下載的代碼放到http服務器的某個目錄中。本例子放到http://hjc/rmi下。
          hjc:機器名,rmi:http的一個目錄。如果只是單機測試則可以放到某個目錄下 如f:\serverclasses.
          本文將對以上兩種方法都給出運行的步驟(policy文件和bat文件)。

          2. 實現Client端程序
          // HelloClient.java
          package jdeveloper.rmi;
          import java.rmi.RMISecurityManager;
          import java.rmi.Naming;
          import java.rmi.RemoteException;
          import java.rmi.NotBoundException;

          public class HelloClient {
          public static void main(String args[]) throws Exception{
          System.setSecurityManager(new RMISecurityManager());
          Hello RemoteObj = (Hello)Naming.lookup("http://"+ args[0] +"/HelloServer");
          System.out.println(RemoteObj.sayHello());
          }
          }

          建立f:\client目錄,把HelloClient.java拷貝到該目錄中。
          建立f:\clientclasses目錄,把hello.jar拷貝到該目錄中。
          f:
          cd \client
          javac -classpath %CLASSPATH%;f:\clientclasses\hello.jar -d . HelloClient.java

          3. 運行程序
          啟動DOS窗口
          set classpath=
          start rmiregistry

          A.以單機方式運行
          建立f:\serverclasses\jdeveloper\rmi目錄
          f:
          cd f:\serverclasses
          copy f:\server\hello.jar .
          copy f:\server\jdeveloper\rmi\HelloImpl_Stub.class f:\serverclasses\jdeveloper\rmi\
          jar xvf hello.jar

          啟動新的DOS窗口
          把 starthelloserver.bat 和 rmiserver.policy 放到f:\server\
          運行 starthelloserver

          starthelloserver.bat
          SET CP=f:\server;f:\serverclasses\hello.jar
          echo using classpath: %CP%
          java -classpath %CP% -Djava.rmi.server.codebase=file:/f:\serverclasses/
          -Djava.rmi.server.hostname=hjc -Djava.security.policy=rmiserver.policy jdeveloper.rmi.HelloImpl

          rmiserver.policy
          grant {
          permission java.net.SocketPermission "*:1024-65535",
          "connect";
          };

          啟動新的DOS窗口
          把 starthelloclient.bat 和 rmiclient.policy 放到f:\client\
          運行 starthelloclient

          starthelloclient.bat
          @echo off
          set CP=f:\client;f:\clientclasses\hello.jar
          echo using classpath %CP%
          @echo on
          java -classpath %CP% -Djava.rmi.server.codebase=file:/f:\serverclasses/
          -Djava.security.policy=rmiclient.policy jdeveloper.rmi.HelloClient %1
          rmiclient.policy
          grant {
          permission java.net.SocketPermission "*:1024-65535",
          "connect";
          permission java.io.FilePermission
          "f:\\serverclasses\\-", "read";
          };

          B.以網絡方式運行
          建立 apache_path\htdocs\rmi\jdeveloper\rmi目錄
          cd apache_path\htdocs\rmi
          copy f:\server\hello.jar .
          copy f:\server\jdeveloper\rmi\HelloImpl_Stub.class apache_path\htdocs\rmi\jdeveloper\rmi
          jar xvf hello.jar
          把 starthellohttpserver.bat 和 rmihttpserver.policy 放到f:\server\

          啟動新的DOS窗口
          運行 starthellohttpserver
          starthellohttpserver.bat
          SET CP=f:\server;f:\serverclasses\hello.jar
          echo using classpath: %CP%
          java -classpath %CP% -Djava.rmi.server.codebase=http://hjc/rmi/
          -Djava.security.policy=rmihttpserver.policy jdeveloper.rmi.HelloImpl
          rmihttpserver.policy
          grant {
          permission java.net.SocketPermission "*:1099", "accept, connect, listen, resolve";
          permission java.net.SocketPermission "*:80", "accept, connect, listen, resolve";
          };

          啟動新的DOS窗口
          把 starthellohttpclient.bat 和 rmihttpclient.policy 放到f:\client\
          運行 starthellohttpclient
          starthellohttpclient.bat
          @echo off
          set CP=f:\client;f:\clientclasses\hello.jar
          echo using classpath %CP%
          @echo on
          java -classpath %CP% -Djava.rmi.server.codebase=http://hjc/rmi/
          -Djava.security.policy=rmihttpclient.policy jdeveloper.rmi.HelloClient %1

          rmihttpclient.policy
          grant {
          permission java.net.SocketPermission "*:80", "connect";
          permission java.net.SocketPermission "*:1024-65535", "connect";
          };
          ?

          posts - 41, comments - 7, trackbacks - 0, articles - 0

          Copyright © weibogao

          主站蜘蛛池模板: 平顺县| 茌平县| 铜川市| 涡阳县| 诸城市| 德江县| 东光县| 始兴县| 济南市| 道孚县| 星座| 繁昌县| 潮州市| 罗江县| 高尔夫| 健康| 武平县| 大田县| 新民市| 平定县| 高邑县| 宁陕县| 盐津县| 新邵县| 本溪市| 华池县| 大姚县| 平舆县| 玉环县| 易门县| 洞口县| 余江县| 特克斯县| 衡南县| 精河县| 丹阳市| 屯昌县| 新绛县| 密山市| 莱州市| 丰城市|