小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 yetao_study 2014-08-14

I的概念

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

 

RMI的開發(fā)步驟

  1. 先創(chuàng)建遠(yuǎn)程接口及聲明遠(yuǎn)程方法,注意這是實現(xiàn)雙方通訊的接口,需要繼承Remote
  2. 開發(fā)一個類來實現(xiàn)遠(yuǎn)程接口及遠(yuǎn)程方法,值得注意的是實現(xiàn)類需要繼承UnicastRemoteObject
  3. 通過javac命令編譯文件,通過java -server 命令注冊服務(wù),啟動遠(yuǎn)程對象
  4. 最后客戶端查找遠(yuǎn)程對象,并調(diào)用遠(yuǎn)程方法

簡單實例

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

[c-sharp] view plaincopy
  1. package rmi.model;  
  2. import java.io.Serializable;  
  3. //注意對象必須繼承Serializable  
  4. public class PersonEntity implements Serializable {  
  5.     private int id;  
  6.     private String name;  
  7.     private int age;  
  8.     public void setId(int id) {  
  9.         this.id = id;  
  10.     }  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setAge(int age) {  
  21.         this.age = age;  
  22.     }  
  23.     public int getAge() {  
  24.         return age;  
  25.     }  
  26. }  

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

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

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

  1. package rmi.serviceImpl;  
  2. import java.rmi.RemoteException;  
  3. import java.rmi.server.UnicastRemoteObject;  
  4. import java.util.LinkedList;  
  5. import java.util.List;  
  6. import rmi.model.PersonEntity;  
  7. import rmi.service.*;  
  8. //此為遠(yuǎn)程對象的實現(xiàn)類,須繼承UnicastRemoteObject  
  9. public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {  
  10.     public PersonServiceImpl() throws RemoteException {  
  11.         super();  
  12.         // TODO Auto-generated constructor stub  
  13.     }  
  14.     @Override  
  15.     public List<PersonEntity> GetList() throws RemoteException {  
  16.         // TODO Auto-generated method stub  
  17.         System.out.println("Get Person Start!");  
  18.         List<PersonEntity> personList=new LinkedList<PersonEntity>();  
  19.           
  20.         PersonEntity person1=new PersonEntity();  
  21.         person1.setAge(25);  
  22.         person1.setId(0);  
  23.         person1.setName("Leslie");  
  24.         personList.add(person1);  
  25.           
  26.         PersonEntity person2=new PersonEntity();  
  27.         person2.setAge(25);  
  28.         person2.setId(1);  
  29.         person2.setName("Rose");  
  30.         personList.add(person2);  
  31.           
  32.         return personList;  
  33.     }  
  34.       
  35. }  

建立服務(wù)器端,在服務(wù)器端注冊RMI通訊端口與通訊路徑,然后通訊javac命令編譯文件,通過java -server 命令注冊服務(wù)。以下面代碼為例,如果閣下將項目建立于D://RMI/RemotingService文件夾上時,則先輸入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啟動服務(wù)。

  1. package rmi.remotingservice;  
  2. import java.rmi.Naming;  
  3. import java.rmi.registry.LocateRegistry;  
  4.    
  5. import rmi.service.*;  
  6. import rmi.serviceImpl.*;  
  7. public class Program{  
  8.     public static void main(String[] args) {  
  9.         // TODO Auto-generated method stub  
  10.         try {  
  11.             PersonService personService=new PersonServiceImpl();  
  12.             //注冊通訊端口  
  13.             LocateRegistry.createRegistry(6600);  
  14.             //注冊通訊路徑  
  15.             Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);  
  16.             System.out.println("Service Start!");  
  17.         } catch (Exception e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22. }  

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

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

 

常見錯誤

  1. 在命令提示符調(diào)用java命令時,顯示并無此命令。這是因為未在“環(huán)境變量”中綁定JAVA的JDK命令造成的,你首先單擊“計算機右 鍵”->“屬性”->“高級”->“環(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
  2. 在調(diào)用javac命令時出現(xiàn)“javac 找不到文件 ..... ”此錯誤,可能是因為閣下輸入的文件路徑出現(xiàn)錯誤造成,注意不要把D://RMI/RemotingService/src>javac rmi/ remotingservice/ Program.java寫錯為D://RMI/RemotingService/src>javac rmi. remotingservice. Program.java
  3. 在調(diào)用D://RMI/RemotingService/bin>java rmi/remotingservice/Program命令時出現(xiàn)“Exception in thread 'main' java.lang.NoClassEdfoundError”錯誤,第一這可能是閣下把Program 錯寫為Program.class ,注意java命令不需要加后綴名。第二可能是閣下把“java rmi/ remotingservice/ Program”錯寫為“java rmi/ remotingservice/ Program"。

原代碼下載

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多