• 125326

    文章

  • 803

    评论

  • 12

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

JAVA RMI

服了这份高薪指南,涨多少你说了算>>

什么是JAVA RMI

Java RMI (Remote Method Invocation) 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过依赖接口这种更简单自然的方式。Java RMI 是 Java 领域创建分布式应用的技术基石。后续的 EJB 技术,以及现代的分布式服务框架,其中的基本理念依旧是 Java RMI 的延续。

JAVA RMI 的工作原理

  1. 服务端向 RMI 注册服务绑定自己的地址;

  2. 客户端通过 RMI 注册服务获取目标地址;

  3. 客户端调用本地的 Stub 对象上的方法,和调用本地对象上的方法一致;

  4. 本地存根对象将调用信息打包,通过网络发送到服务端;

  5. 服务端的 Skeleton 对象收到网络请求之后,将调用信息解包;

  6. 然后找到真正的服务对象发起调用,并将返回结果打包通过网络发送回客户端。

开发步骤

 1、编写远程服务接口,该接口必须继承 java.rmi.Remote 接口,方法必须抛出 java.rmi.RemoteException 异常;  
 2、编写远程接口实现类,该实现类必须继承 java.rmi.server.UnicastRemoteObject 类;  
 3、运行RMI编译器(rmic),创建客户端 stub 类和服务端 skeleton 类;  
 4、启动一个RMI注册表,以便驻留这些服务;  
 5、在RMI注册表中注册服务;  
 6、客户端查找远程对象,并调用远程方法;

 

写一个小demo测试下:

1、创建远程接口,继承java.rmi.Remote接口

import java.rmi.Remote;
import java.rmi.RemoteException;


public interface SimpleService extends Remote{

    /**
     * 远程接口方法必须抛出 java.rmi.RemoteException
     * @param message
     * @return
     * @throws RemoteException
     */
    String sayHello(String message) throws RemoteException;
}

2、实现远程接口,继承 java.rmi.server.UnicastRemoteObject类,生成可以与服务端通讯的 Stub 对象

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class SimpleServiceImpl extends UnicastRemoteObject implements SimpleService {

    private static final long serialVersionUID = 3451921729092664613L;

    private String message;

    public SimpleServiceImpl() throws RemoteException {

    }

    public SimpleServiceImpl(String message) throws RemoteException {
        this.message=message;
    }



    @Override
    public String sayHello(String message) throws RemoteException {
        // TODO Auto-generated method stub
        return "RPC sayHello: " + message;
    }

}

3,启动RMI注册服务,指定端口为1099,将 Stub 对象绑定到注册服务上,客户端可以通过绑定的服务名查找到该远程对象。

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class Server {

        public static void main(String[] args){

             try {
                 //启动RMI注册服务,指定端口为1099 (1099为默认端口)   
                 //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用   
                 LocateRegistry.createRegistry(1099);

                 //创建远程对象的一个或多个实例,下面是stub对象   
                 //可以用不同名字注册不同的实例
                 //SimpleService stub=new SimpleServiceImpl("SimpleService");
                 SimpleService stub=new SimpleServiceImpl();
                 //把stub注册到RMI注册服务器上,命名为SimpleService
                 //Naming.rebind("SimpleService", stub);  

                 //也可以把stub实例注册到另一台启动了RMI注册服务的机器上     
                 Naming.rebind("rmi://localhost:1099/SimpleService",stub);

                 System.out.println("Server is ready.");
             } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Server  failed.");
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Server  failed.");
            }
        }
}

4,客户端查找远程对象,并调用远程方法

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;

public class Client {

    public static void main(String[] args){
         try {

             //SimpleService simpleService = (SimpleService) Naming.lookup("SimpleService");

             //从另一台启动了RMI注册服务的机器上查找SimpleService实例   
             SimpleService simpleService = (SimpleService)Naming.lookup("rmi://localhost:1099/SimpleService");
             System.out.println("Client send");
             //调用远程方法 
             String result = simpleService.sayHello("client");
             System.out.println("Client result:"+result);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}

695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

0条评论

Loading...


自定义皮肤 主体内容背景
打开支付宝扫码付款购买视频教程
遇到问题联系客服QQ:419400980
注册梁钟霖个人博客