在上一篇学习dubbo时 提到RMI,远程调用,下面找了篇不错的文章 学习下:http://6221123.blog.51cto.com/6211123/1112619
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。
接口的两种常见实现方式是:最初使用JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现;此外还可以用与CORBA兼容的方法实现。RMI一般指的是编程接口,也有时候同时包括JRMP和API(应用程序编程接口),而RMI-IIOP则一般指RMI接口接管绝大部分的功能,以支持CORBA的实现。
最初的RMI API设计为通用地支持不同形式的接口实现。后来,CORBA增加了传值(pass by value)功能,以实现RMI接口。然而RMI-IIOP和JRMP实现的接口并不完全一致。
- package dataserver.rmi.stub;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- import dataserver.rmi.bean.Account;
- public interface UserManagerInterface extends Remote{
- public String getUserName() throws RemoteException;
- public Account getAdminAccount() throws RemoteException;
- }
- package dataserver.rmi.bean;
- import java.io.Serializable;
- public class Account implements Serializable,Cloneable{
- /**
- *
- */
- private static final long serialVersionUID = -1858518369668584532L;
- private String username;
- private String password;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
- package dataserver.rmi;
- import java.rmi.RemoteException;
- import dataserver.rmi.bean.Account;
- import dataserver.rmi.stub.UserManagerInterface;
- public class UserManagerImpl implements UserManagerInterface {
- public UserManagerImpl() throws RemoteException {
- //super();
- // TODO Auto-generated constructor stub
- //UnicastRemoteObject.exportObject(this);
- }
- /**
- *
- */
- private static final long serialVersionUID = -3111492742628447261L;
- public String getUserName() throws RemoteException {
- // TODO Auto-generated method stub
- return "Tommy Lee";
- }
- public Account getAdminAccount() throws RemoteException {
- // TODO Auto-generated method stub
- Account account=new Account();
- account.setUsername("admin");
- account.setPassword("admin");
- return account;
- }
- }
- package dataserver.entry;
- import java.rmi.AlreadyBoundException;
- import java.rmi.RemoteException;
- import java.rmi.registry.LocateRegistry;
- import java.rmi.registry.Registry;
- import java.rmi.server.UnicastRemoteObject;
- import dataserver.rmi.UserManagerImpl;
- import dataserver.rmi.stub.UserManagerInterface;
- public class Entry {
- public static void main(String []args) throws AlreadyBoundException, RemoteException{
- UserManagerImpl userManager=new UserManagerImpl();
- UserManagerInterface userManagerI=(UserManagerInterface)UnicastRemoteObject.exportObject(userManager,0);
- // Bind the remote object's stub in the registry
- Registry registry = LocateRegistry.createRegistry(2001);
- registry.rebind("userManager", userManagerI);
- System.out.println("server is ready");
- }
- }
- package weiblog.rmi;
- import java.rmi.NotBoundException;
- import java.rmi.RemoteException;
- import java.rmi.registry.LocateRegistry;
- import java.rmi.registry.Registry;
- import dataserver.rmi.stub.UserManagerInterface;
- public class Entry2 {
- public static void main(String []args){
- try {
- Registry registry = LocateRegistry.getRegistry("localhost",2001);
- UserManagerInterface userManager = (UserManagerInterface) registry.lookup("userManager");
- System.out.println(""+userManager.getAdminAccount().getUsername()
- +userManager.getAdminAccount().getPassword());
- } catch (RemoteException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (NotBoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }