RMI网络编程开发之二 如何搭建基于JDK1.5的分布式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接口。
 01.package dataserver.rmi.stub; 02. 03.import java.rmi.Remote; 04.import java.rmi.RemoteException; 05. 06.import dataserver.rmi.bean.Account; 07. 08.public interface UserManagerInterface extends Remote{ 09.    public String getUserName() throws RemoteException; 10.    public Account getAdminAccount() throws RemoteException; 11.} 
2. 为了证明RMI中,“面向对象”或者是“无缝传递JAVA Object”是何等简单,我们需要定义一个Account类,该类是一个Bean,必须实现implements Serializable序列化接口。这是一个可以在client和server传输的可序列化对象。
 01.package dataserver.rmi.bean; 02. 03.import java.io.Serializable; 04. 05.public class Account implements Serializable,Cloneable{ 06. 07.    /** 08.     *  09.     */ 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.      27.}
 
3. 此时,需要实现你已经开放的接口:
 01.package dataserver.rmi; 02. 03.import java.rmi.RemoteException; 04. 05.import dataserver.rmi.bean.Account; 06.import dataserver.rmi.stub.UserManagerInterface; 07. 08.public class UserManagerImpl implements UserManagerInterface { 09. 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. 34.} 
4. 定义一个主程序入口,注册你已经实现的RMI接口,包括开放端口等。其实很简单:
 
把我们的接口名称,命名为“userManager”,方便client进行调用
 01.package dataserver.entry; 02. 03.import java.rmi.AlreadyBoundException; 04.import java.rmi.RemoteException; 05.import java.rmi.registry.LocateRegistry; 06.import java.rmi.registry.Registry; 07.import java.rmi.server.UnicastRemoteObject; 08. 09.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.    } 24.} 
 
 
5. Server端的代码已经全部写完,但是还要把bean类(Account)和接口类(UserMangerInterface)打包成jar,以便可以在下面导入进client端的项目中。
 
项目--》右键--》导出--》jar--》选择bean和interface--》命名为RmiServerInterface.jar--》finish
 


6.  开始创建client端的程序。新建一个project。创建完成后,把刚才jar包导入进client的项目中。
 
7.  导入我们的接口jar以后,可以开始编写一个client端的主程序,并调用server端的方法。
 01.package weiblog.rmi; 02.import java.rmi.NotBoundException; 03.import java.rmi.RemoteException; 04.import java.rmi.registry.LocateRegistry; 05.import java.rmi.registry.Registry; 06. 07.import dataserver.rmi.stub.UserManagerInterface; 08. 09.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.    } 27.} 
8. 启动server端的主程序,然后启动client端的主程序。
 
server控制台打印:server is ready
 
client控制台打印:adminadmin
 
大功告成!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值