基于Java远程接口RMI解析与实现

1、Java远程接口:

   继承JAVA类remote接口,该类允许使用RMI语法实现接口。

import java.rmi.*;

public interface SomeInterface extends Remote{

    public String someMethod1() throws java.rmi,RemoteException;

    public int someMethod2(float someparameter) throws java.rmi.RemoteException;

}

2、服务器端软件:

1)实现接口部分定义的每个远程方法。

2)向目录服务注册包含了实现的对象。

建议这2个类做为独立的类分别提供

3)远程接口实现

本例为:

import java.rmi.*;

import java.rmi.server.*;

public class SomeImpl extends UnicastRemoteObject implements SomeInterface{

   public SomeImpl() throws RemoteException{super();}

   public someMethod1() throws RemoteException {//code}

   public someMethod2() throws RemoteException {//code}

 

}

A)单播RMI:SomeImpl继承UnicastRemoteObject类,使用java远程接口(本例中为SomeInterface),实现接口所有的方法。

B)组播RMI:SomeImpl改成继承MulticastRemoteObject类,使用java远程接口(本例中为SomeInterface),实现接口所有的方法。

4)stub和skeleton生成

A)为对象服务器和对象客房提供代理,分别为skeleton和stub。

B)使用rmic编译远程接口,生成stub和skeleton。

   rmic 类名(本例为SomeImpl)

   以上的类名是指继承UnicastRemoteObject类或MulticastRemoteObject类,使用java远程接口的类

C)编译成功生成2个代理文件,每个文件的名都以实现类的类名为前缀,本例为:SomeImpl_skel.class和SomeImpl_stub.class

3、对象服务器

初始化并输出远程接口实现对象。

import java.rmi.*;

import java.rmi.server.*;

import java.rmi.registry.Registry;

import java.rmi.registry.LocateRegisrty;

import java.net.*;

import java.io.*;

 

public class SomeServer{

   public static void main(String args[]){

       String portNum="1234",registryURL;

       try{

           SomeIpl exportedObj=new SomeImpl();//创建远程接口

           startRegistry(1234);//启动注册对象服务

           //以下输出该对象,在目录服务中注册该对象的引用。本例使用java sdk提供

//的rmiregistry注册该对象。每个RMI注册表维护一个输出对象列

//表,并提供查找这些对象的接口。注册表可以被运行在同一主机上的所有对象服务器共享。

           registryURL="rmi://localhost:"+portNum+"/some";//要存储到注册表的对象引用

           //格式为:rmi://<host name>:<port number>/<reference name>

           Naming.rebind(registryURL,exportedObj);//在注册表存储引用,rebind将覆盖注册表

           //中与给定引用名绑定的任何引用,如何不希望覆盖可以使用bind,

           //(Naming用于从注册表获取或存储引用)

          }

      catch (Exception e){

          System.out.println("Exception:"+e);

      }

  }

private static void startzRegistry(int RMIPortNum) throws RemoteException{

    try{

        Registry registry=LocateRegistry.getRegistry(RMIPortNum);

        registry.list();

    }

   catch (RemoteException ex){

        System.our.println("RMI registry cannot be located at port"+RmiPortNum);

        Registry registry=LocateRegistry.createRegistry(RMIPortNum);

        System.out.println("RMI registry created at port"+RMIPortNum);

   }
}
  }

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzyzxg.html