[Java] 演示RMI(遠程方法調用) 的一個例子

[原文鏈接]

這裏講述的是基於JDK1.5的RMI程序搭建,更簡單的說是一個 HelloWorld RMI。

1. 這裏是基於JDK1.5的,節省了繁瑣的手工編譯(生成樁和骨架)。不像1.4之前的RMI。

2. 這裏是把客戶端和服務器端的兩個程序,分佈在兩個獨立的程序裏面,而不是同一個package下面。是真正的分佈式。

3. 這裏不過多闡述原理,這只是一個Hello World!!

好,以下是步驟:

1. 在Eclipse裏面創建一個server 端的project。然後,創建一個接口,這個接口是你要向client端開放的方法定義。它叫做:UserManagerInterface,而且必須繼承Remote接口。

  1. package dataserver.rmi.stub; 
  2.  
  3. import java.rmi.Remote; 
  4. import java.rmi.RemoteException; 
  5.  
  6. import dataserver.rmi.bean.Account; 
  7.  
  8. public interface UserManagerInterface extends Remote{ 
  9.     public String getUserName() throws RemoteException; 
  10.     public Account getAdminAccount() throws RemoteException; 

2. 爲了證明RMI中,“面向對象”或者是“無縫傳遞JAVA Object”是何等簡單,我們需要定義一個Account類,該類是一個Bean,必須實現implements Serializable序列化接口。這是一個可以在client和server傳輸的可序列化對象。

  1. package dataserver.rmi.bean; 
  2.  
  3. import java.io.Serializable; 
  4.  
  5. public class Account implements Serializable,Cloneable{ 
  6.  
  7.     /** 
  8.      *  
  9.      */ 
  10.     private static final long serialVersionUID = -1858518369668584532L; 
  11.     private String username; 
  12.     private String password; 
  13.      
  14.     public String getUsername() { 
  15.         return username; 
  16.     } 
  17.     public void setUsername(String username) { 
  18.         this.username = username; 
  19.     } 
  20.     public String getPassword() { 
  21.         return password; 
  22.     } 
  23.     public void setPassword(String password) { 
  24.         this.password = password; 
  25.     } 
  26.      

3. 此時,需要實現你已經開放的接口:

  1. package dataserver.rmi; 
  2.  
  3. import java.rmi.RemoteException; 
  4.  
  5. import dataserver.rmi.bean.Account; 
  6. import dataserver.rmi.stub.UserManagerInterface; 
  7.  
  8. public class UserManagerImpl implements UserManagerInterface { 
  9.  
  10.     public UserManagerImpl() throws RemoteException { 
  11.         //super(); 
  12.         // TODO Auto-generated constructor stub 
  13.         //UnicastRemoteObject.exportObject(this); 
  14.     } 
  15.  
  16.     /** 
  17.      *  
  18.      */ 
  19.     private static final long serialVersionUID = -3111492742628447261L; 
  20.  
  21.     public String getUserName() throws RemoteException { 
  22.         // TODO Auto-generated method stub 
  23.         return "Tommy Lee"
  24.     } 
  25.  
  26.     public Account getAdminAccount() throws RemoteException { 
  27.         // TODO Auto-generated method stub 
  28.         Account account=new Account(); 
  29.         account.setUsername("admin"); 
  30.         account.setPassword("admin"); 
  31.         return account; 
  32.     } 
  33.  

4. 定義一個主程序入口,註冊你已經實現的RMI接口,包括開放端口等。其實很簡單:

把我們的接口名稱,命名爲“userManager”,方便client進行調用

  1. package dataserver.entry; 
  2.  
  3. import java.rmi.AlreadyBoundException; 
  4. import java.rmi.RemoteException; 
  5. import java.rmi.registry.LocateRegistry; 
  6. import java.rmi.registry.Registry; 
  7. import java.rmi.server.UnicastRemoteObject; 
  8.  
  9. import dataserver.rmi.UserManagerImpl; 
  10. import dataserver.rmi.stub.UserManagerInterface; 
  11.  
  12. public class Entry { 
  13.  
  14.     public static void main(String []args) throws AlreadyBoundException, RemoteException{ 
  15.      
  16.  
  17.             UserManagerImpl userManager=new UserManagerImpl(); 
  18.             UserManagerInterface userManagerI=(UserManagerInterface)UnicastRemoteObject.exportObject(userManager,0); 
  19.             // Bind the remote object's stub in the registry 
  20.             Registry registry = LocateRegistry.createRegistry(2001); 
  21.             registry.rebind("userManager", userManagerI); 
  22.             System.out.println("server is ready"); 
  23.     } 

 

5. Server端的代碼已經全部寫完,但是還要把bean類(Account)和接口類(UserMangerInterface)打包成jar,以便可以在下面導入進client端的項目中。

項目--》右鍵--》導出--》jar--》選擇bean和interface--》命名爲RmiServerInterface.jar--》finish

6.  開始創建client端的程序。新建一個project。創建完成後,把剛纔jar包導入進client的項目中。

7.  導入我們的接口jar以後,可以開始編寫一個client端的主程序,並調用server端的方法。

  1. package weiblog.rmi; 
  2. import java.rmi.NotBoundException; 
  3. import java.rmi.RemoteException; 
  4. import java.rmi.registry.LocateRegistry; 
  5. import java.rmi.registry.Registry; 
  6.  
  7. import dataserver.rmi.stub.UserManagerInterface; 
  8.  
  9. public class Entry2 { 
  10.  
  11.     public static void main(String []args){ 
  12.          
  13.         try { 
  14.             Registry registry = LocateRegistry.getRegistry("localhost",2001); 
  15.             UserManagerInterface userManager = (UserManagerInterface) registry.lookup("userManager"); 
  16.             System.out.println(""+userManager.getAdminAccount().getUsername() 
  17.                     +userManager.getAdminAccount().getPassword()); 
  18.         } catch (RemoteException e) { 
  19.             // TODO Auto-generated catch block 
  20.             e.printStackTrace(); 
  21.         } catch (NotBoundException e) { 
  22.             // TODO Auto-generated catch block 
  23.             e.printStackTrace(); 
  24.         } 
  25.          
  26.     } 

8. 啓動server端的主程序,然後啓動client端的主程序。

server控制檯打印:server is ready

client控制檯打印:adminadmin

大功告成!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章