qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          學(xué)習(xí)筆記:JAVA RMI遠(yuǎn)程方法調(diào)用簡單實(shí)例

           RMI的概念

            RMI(Remote Method Invocation)遠(yuǎn)程方法調(diào)用是一種計(jì)算機(jī)之間利用遠(yuǎn)程對(duì)象互相調(diào)用實(shí)現(xiàn)雙方通訊的一種通訊機(jī)制。使用這種機(jī)制,某一臺(tái)計(jì)算機(jī)上的對(duì)象可以調(diào)用另外一臺(tái)計(jì)算機(jī)上的對(duì)象來獲取遠(yuǎn)程數(shù)據(jù)。RMI是Enterprise JavaBeans的支柱,是建立分布式Java應(yīng)用程序的方便途徑。在過去,TCP/IP套接字通訊是遠(yuǎn)程通訊的主要手段,但此開發(fā)方式?jīng)]有使用面向?qū)ο蟮姆绞綄?shí)現(xiàn)開發(fā),在開發(fā)一個(gè)如此的通訊機(jī)制時(shí)往往令程序員感覺到乏味,對(duì)此RPC(Remote Procedure Call)應(yīng)運(yùn)而生,它使程序員更容易地調(diào)用遠(yuǎn)程程序,但在面對(duì)復(fù)雜的信息傳訊時(shí),RPC依然未能很好的支持,而且RPC未能做到面向?qū)ο笳{(diào)用的開發(fā)模式。針對(duì)RPC服務(wù)遺留的問題,RMI出現(xiàn)在世人面前,它被設(shè)計(jì)成一種面向?qū)ο蟮耐ㄓ嵎绞剑试S程序員使用遠(yuǎn)程對(duì)象來實(shí)現(xiàn)通信,并且支持多線程的服務(wù),這是一次遠(yuǎn)程通訊的革命,為遠(yuǎn)程通信開辟新的里程碑。

            RMI的開發(fā)步驟

            先創(chuàng)建遠(yuǎn)程接口及聲明遠(yuǎn)程方法,注意這是實(shí)現(xiàn)雙方通訊的接口,需要繼承Remote

            開發(fā)一個(gè)類來實(shí)現(xiàn)遠(yuǎn)程接口及遠(yuǎn)程方法,值得注意的是實(shí)現(xiàn)類需要繼承UnicastRemoteObject

            通過javac命令編譯文件,通過java -server 命令注冊(cè)服務(wù),啟動(dòng)遠(yuǎn)程對(duì)象

            最后客戶端查找遠(yuǎn)程對(duì)象,并調(diào)用遠(yuǎn)程方法

            簡單實(shí)例

            首先為服務(wù)建立一個(gè)Model層,注意因?yàn)榇藢?duì)象需要現(xiàn)實(shí)進(jìn)行遠(yuǎn)程傳輸,所以必須繼承Serializable

          package rmi.model;

          import java.io.Serializable;

          //注意對(duì)象必須繼承Serializable
          publicclass PersonEntity implements Serializable {
          privateint id;
          private String name;
          privateint age;

          publicvoid setId(int id) {
          this.id = id;
          }

          publicint getId() {
          return id;
          }

          publicvoid setName(String name) {
          this.name = name;
          }

          public String getName() {
          return name;
          }

          publicvoid setAge(int age) {
          this.age = age;
          }

          publicint getAge() {
          return age;
          }
          }

            創(chuàng)建遠(yuǎn)程接口PersonService,注意遠(yuǎn)程接口需要繼承Remote

          package rmi.service;
          import java.rmi.Remote;
          import java.rmi.RemoteException;
          import java.util.List;
          import rmi.model.*;
          //此為遠(yuǎn)程對(duì)象調(diào)用的接口,必須繼承Remote類
          public interface PersonService extends Remote {
          public List<PersonEntity> GetList() throws RemoteException;
          }



            建立PersonServiceImpl實(shí)現(xiàn)遠(yuǎn)程接口,注意此為遠(yuǎn)程對(duì)象實(shí)現(xiàn)類,需要繼承UnicastRemoteObject

          package rmi.serviceImpl;
          import java.rmi.RemoteException;
          import java.rmi.server.UnicastRemoteObject;
          import java.util.LinkedList;
          import java.util.List;
          import rmi.model.PersonEntity;
          import rmi.service.*;
          //此為遠(yuǎn)程對(duì)象的實(shí)現(xiàn)類,須繼承UnicastRemoteObject
          public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {
          public PersonServiceImpl() throws RemoteException {
          super();
          // TODO Auto-generated constructor stub
          }
          public List<PersonEntity> GetList() throws RemoteException {
          // TODO Auto-generated method stub
          System.out.println("Get Person Start!");
          List<PersonEntity> personList=new LinkedList<PersonEntity>();
          PersonEntity person1=new PersonEntity();
          person1.setAge(25);
          person1.setId(0);
          person1.setName("Leslie");
          personList.add(person1);
          PersonEntity person2=new PersonEntity();
          person2.setAge(25);
          person2.setId(1);
          person2.setName("Rose");
          personList.add(person2);
          return personList;
          }
          }

            建立服務(wù)器端,在服務(wù)器端注冊(cè)RMI通訊端口與通訊路徑,然后通訊javac命令編譯文件,通過java -server 命令注冊(cè)服務(wù)。以下面代碼為例,如果閣下將項(xiàng)目建立于D:\\RMI\RemotingService文件夾上時(shí),則先輸入D:\\RMI\RemotingService\src>javac rmi/remotingservice/Program.java獲取Program.class(如何閣下使用的MyEclipse等開發(fā)工具,可跳過此步,直接在*/bin文件夾中直接調(diào)用已經(jīng)生成的Program.class),然后輸入D:\\RMI\RemotingService\src>java rmi/remotingservice/Program啟動(dòng)服務(wù)。

          package rmi.remotingservice;
          import java.rmi.Naming;
          import java.rmi.registry.LocateRegistry;
          import rmi.service.*;
          import rmi.serviceImpl.*;
          public class Program{
          public static void main(String[] args) {
          try {
          PersonService personService=new PersonServiceImpl();
          //注冊(cè)通訊端口
          LocateRegistry.createRegistry(6600);
          //注冊(cè)通訊路徑
          Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);
          System.out.println("Service Start!");
          } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          }
          }
          }



           最后建立客戶端進(jìn)行測(cè)試,注意客戶調(diào)用的RMI路徑必須服務(wù)器配置一致

          package rmi.remotingclient;
          import java.rmi.Naming;
          import java.util.List;
          import rmi.model.PersonEntity;
          import rmi.service.*;
          public class Program {
          public static void main(String[] args){
          try{
          //調(diào)用遠(yuǎn)程對(duì)象,注意RMI路徑與接口必須與服務(wù)器配置一致
          PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");
          List<PersonEntity> personList=personService.GetList();
          for(PersonEntity person:personList){
          System.out.println("ID:"+person.getId()+" Age:"+person.getAge()+" Name:"+person.getName());
          }
          }catch(Exception ex){
          ex.printStackTrace();
          }
          }
          }

            常見錯(cuò)誤

            在命令提示符調(diào)用java命令時(shí),顯示并無此命令。這是因?yàn)槲丛?#8220;環(huán)境變量”中綁定JAVA的JDK命令造成的,你首先單擊“計(jì)算機(jī)右鍵”->“屬性”->“高級(jí)”->“環(huán)境變量”。在系統(tǒng)變量Path設(shè)置中加載為JDK的路徑  .;D:\Program Files\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin。然后在ClassPath加載服務(wù)器端的Program.class地址 .;D:\\RMI\RemotingService\bin

            在調(diào)用javac命令時(shí)出現(xiàn)“javac 找不到文件 ..... ”此錯(cuò)誤,可能是因?yàn)殚w下輸入的文件路徑出現(xiàn)錯(cuò)誤造成,注意不要把D:\\RMI\RemotingService\src>javac rmi/remotingservice/Program.java寫錯(cuò)為D:\\RMI\RemotingService\src>javac rmi.remotingservice.Program.java

            在調(diào)用D:\\RMI\RemotingService\bin>java rmi/remotingservice/Program命令時(shí)出現(xiàn)“Exception in thread 'main' java.lang.NoClassEdfoundError”錯(cuò)誤,第一這可能是閣下把Program錯(cuò)寫為Program.class,注意java命令不需要加后綴名。第二可能是閣下把“java rmi/remotingservice/Program”錯(cuò)寫為“java rmi\remotingservice\Program"。

          posted on 2013-09-24 10:22 順其自然EVO 閱讀(212) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          <2013年9月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 侯马市| 长子县| 依兰县| 柳江县| 威远县| 黑龙江省| 蚌埠市| 本溪| 扎鲁特旗| 南靖县| 肃南| 威海市| 巴塘县| 赤峰市| 凯里市| 怀来县| 都昌县| 吉水县| 黄浦区| 逊克县| 修文县| 云林县| 军事| 柳林县| 绥江县| 黄龙县| 深泽县| 乌兰察布市| 吉隆县| 辰溪县| 徐闻县| 拉萨市| 江达县| 南郑县| 江津市| 朝阳县| 云和县| 二连浩特市| 侯马市| 德惠市| 康马县|