zoukankan      html  css  js  c++  java
  • RMI分布式议程服务学习

    转自:http://6221123.blog.51cto.com/6211123/1112619

    这里讲述的是基于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

    大功告成!!

  • 相关阅读:
    算法70----只有两个键的键盘【动态规划】
    Shell
    Shell
    Shell
    Shell
    Shell
    Tools
    Jenkins
    Java
    Product
  • 原文地址:https://www.cnblogs.com/acvc/p/3600866.html
Copyright © 2011-2022 走看看