Java入门-简单的RMI示例

RMI是一种分布式技术,使用RMI可以让一个虚拟机上的应用程序请求调用位于网络上另一处JVM上的对象方法。这是的以分布式方式部署应用成为了可能。

RMI的两个核心所在分别为Skeleton和Stub:

  • Skeleton只在位于服务器端的程序,负责接受客户端发来的请求数据,并交由服务器端业务处理程序处理,最后将处理结果返回给客户端。
  •  Stub则负责在客户端向服务器端发送相关数据。

开发RMI应用程序需要以下几步:

  • 定义远程接口:继承自java.rmi.Remote定义应用接口:IAppInterface
  • 实现服务端对象:需继承自java.rmi.UnicastRemoteObject,同时要实现已定义的接口IAppINterface中的方法
  • 启动RMI注册服务
  • 执行start rmiregistry启动RMI注册服务
  • 启动服务端程序,注册到RMI注册表中
  • 开发并执行客户端程序

在程序中执行java.rmi.registry.LocateRegistry的createRegistry(int port)方法完成RMI注册服务的启动。

java.rmi.registry.Registry接口提供了几个方法来实现对RMI注册表的访问(类似于操作JNDI命名空间的javax.naming.Context接口)

  • void bind(String name, java.rmi.Remote obj):将obj对象绑定在RMI注册表中,键值为name
  • void rebind(String name, java.rmi.Remote obj):重写键值为name的RMI注册表绑定关系,把obj绑定在RMI注册表中,键值为name
  • java.rmi.Remote lookup(String name):在RMI注册表中根据键值name查找对象并返回
  • void unbind(String name):解除键值为name的对象的RMI绑定关系

示例:
1、定义远程接口

package org.eone.test.rmi;
 
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface IWeather extends Remote{
    public String getWeather(String city) throws RemoteException;
}

 2、实现远程服务

package org.eone.test.rmi;
 
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
 
public class WeatherImpl extends UnicastRemoteObject implements IWeather{
    public WeatherImpl() throws RemoteException{
    }
    public String getWeather(String city){
        return city + " : is Sunny...";
    }
 
    public static void main(String[] args){
        try{
            Registry registry = LocateRegistry.createRegistry(1099);
            registry.bind("/weather", new WeatherImpl());
            System.out.println("服务对象已绑定至注册表...");
        }catch(Exception e){
            System.out.println("绑定服务对象到注册表失败...");
        }
    }
}

 3、开发并运行客户端程序

package org.eone.test.rmi;
 
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
 
public class WeatherClient{
    public static void main(String[] args){
        try{
            Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
            IWeather stub = (IWeather)registry.lookup("/weather");
            String result = stub.getWeather("SHANGHAI");
            System.out.println(result);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
 

你可能感兴趣的:(java入门)