rmi学习笔记(1)

来源:互联网 发布:mac魔兽世界多少g 编辑:程序博客网 时间:2024/06/05 05:00

RMI学习笔记(1)

RMI(RemoteMethod Invocation):远程方法调用,该技术在Java1.1就已经出现,是一项非常重要的底层技术。

这种技术可以实现Java远程方法的调用,即一个Java虚拟机上的对象可以调用另一个Java虚拟机上的对象的方法。举个简单的例子:有两个Java工程,分别部署在不同的机器上,在A工程中有一个功能,需要从B工程中的某个方法取得数据(如:一台设备的实时监测数据),此时就可以用rmi实现两个工程中方法的远程调用。写个简单的hellworld例子:

1. 在eclipse中创建三个工程,分别为rmiArmiBrmiInterface

说明:rmiA用于远程方法实现

         rmiB用于远程调用

            rmiInterface用于公共接口

2. 在rmiInterface工程中定义一个远程接口(该接口必须继承Remote类,并且接口中的方法必须抛出RemoteException异常)

① IHelloWorld.java

packagecom.demo.interfaces;

importjava.rmi.Remote;

importjava.rmi.RemoteException;

publicinterface IHelloWorld extends Remote

{

publicvoid sayHelloworld() throws RemoteException;

}

3. 将rmiInterface项目打包成jar文件,分别添加到rmiA、rmiB项目中

4. 实现远程接口(这个实现必须有一个显式的构造函数,并且要抛出RemoteException异常)

② HelloWorldImpl.java

packagecom.rmi.demo.imp;

importjava.rmi.RemoteException;

importjava.rmi.server.UnicastRemoteObject;

importcom.rmi.demo.interfaces.IHelloWorld;

 

publicclass HelloWorldImpl extends UnicastRemoteObject implements IHelloWorld

{

public HelloWorldImpl() throws RemoteException

{

        super();

}

@Override

public void sayHelloworld() throwsRemoteException

{

        System.out.println("HelloWorld!");

}

}

5. 新建一个rmi客户端调用程序。

① 创建一个接口的实例

② 创建注册表

③ 绑定对象到远程注册表

ServerStart.java

packagecom.demo.start;

 

importjava.net.MalformedURLException;

importjava.rmi.AlreadyBoundException;

importjava.rmi.Naming;

importjava.rmi.RemoteException;

importjava.rmi.registry.LocateRegistry;

importcom.demo.imp.HelloWorldImpl;

importcom.demo.interfaces.IHelloWorld;

 

publicclass ServerStart

{

  public static void main(String[] args)

  {

         try

         {

                //创建一个远程接口的实例

                IHelloWorld helloWorld = newHelloWorldImpl();

               

                //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上

                LocateRegistry.createRegistry(8888);

               

                //把远程对象注册到RMI注册服务器上,并命名为helloWorld

                Naming.bind("rmi://localhost:8888/helloWorld",helloWorld);

                System.out.println("远程服务对象绑定成功---->");

         }

         catch (RemoteException e)

         {

                System.out.println("创建远程对象发生异常!");

                e.printStackTrace();

         }

         catch (AlreadyBoundException e)

         {

                System.out.println("发生重复绑定对象异常!");

                e.printStackTrace();

         }

         catch (MalformedURLException e)

         {

                System.out.println("发生URL畸形异常!");

                e.printStackTrace();

         }

  }

}

6.编写客户端方法

ClientCall.java

package com.rmi.demo.call;

 

importjava.net.MalformedURLException;

import java.rmi.Naming;

import java.rmi.NotBoundException;

import java.rmi.RemoteException;

importcom.rmi.demo.interfaces.IHelloWorld;

 

public class ClientCall

{

       publicstatic void main(String[] args)

       {

              try

              {

                     IHelloWorldhelloWorld = (IHelloWorld)Naming.lookup("rmi://localhost:8888/helloWorld");

                     helloWorld.sayHelloworld();

              }

              catch(MalformedURLException e)

              {

                     e.printStackTrace();

              }

              catch(RemoteException e)

              {

                     e.printStackTrace();

              }

              catch(NotBoundException e)

              {

                     e.printStackTrace();

              }

       }

}

测试:先启动serverstart,然后启动clientcall

0 0
原创粉丝点击