[原创]RMI概述和编程_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3024 | 回复: 0   主题: [原创]RMI概述和编程        下一篇 
    本主题由 koei123 于 2015-6-2 8:56:17 移动
xiuwen.zhao
高级会员
等级:上尉
经验:668
发帖:38
精华:0
注册:1970-1-1
状态:离线
发送短消息息给xiuwen.zhao 加好友    发送短消息息给xiuwen.zhao 发消息
发表于: IP:您无权察看 2014-8-26 16:33:38 | [全部帖] [楼主帖] 楼主

1.RMI概述

远程访问允许客户机访问其他计算机的对象和服务,就像这些对象和服务就在本地一样。远程访问是分布式应用基础,也是JavaEE应用架构的基础之一。Java为远程访问提供了很好的简化,RMI是Java远程访问的重要规范之一,它允许本地Java程序直接调用远程Java方法。

2.RMI编程

下面通过一个实际的例子介绍一下RMI的编程方法.

2.1 开发RMI服务器

我们首先需要编写RMI服务器,RMI需要通过远程接口“暴露”服务。也就是说,所有想被客户端调用的方法都必须在Remote接口里声明,而远程接口必须继承Remote接口。具体代码如下:

import java.rmi.*;
public interface Server extends Remote {
      String hello(String name) throws RemoteException;
      Person getPerson(String name, int age) throws RemoteException;
}


上面代码用到了一个Person类,具体代码如下:

import java.io.Serializable;
public class Person implements Serializable{
      private String name;
      private int age;
      public Person() {
      };
      public Person(String name, int age) {
            this.name = name;
            this.age = age;
      }
      public void setName(String name) {
            this.name = name;
      }
      public String getName() {
            return name;
      }
      public void setAge(int age) {
            this.age = age;
      }
      public int getAge() {
            return age;
      }
}


RMI服务是典型的面向接口编程,只有在远程接口中定义的方法才能对外提供远程服务,因此开发RMI服务器端程序时需要先为远程服务编写接口,再编写远程服务实现类。

下面是远程服务实现类,该类必须实现远程接口,且要继承java.rmi.server.UnicastRemoteObject类,继承该类可以“暴露”远程服务。

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
public class ServerImpl extends UnicastRemoteObject implements Server {
      protected ServerImpl() throws RemoteException {
      }
      public String hello(String name) throws RemoteException{
            return "Hello " + name;
      }
      public Person getPerson(String name, int age) throws RemoteException{
            return new Person(name, age);
      }
      public void info(){
            System.out.println("I'm a local method!");
      }
      public static void main(String[] args) throws RemoteException, MalformedURLException{
            Server imp = new ServerImpl();
            LocateRegistry.createRegistry(9000);
            Naming.rebind("rmi://:9000/rmi", imp);
      }
}


在远程接口中没有定义的方法是不可以“暴露”给其他Java应用程序的。主函数内创建远程服务类的实例,并通过Naming类的bind()和rebind()方法将其绑定到指定JNDI名称。之后使用LocateRegistry类在程序内完成注册。

2.2 开发RMI客户端

RMI的客户端程序实现比较简单,只需两步:

① 通过JNDI查找提供远程RMI服务的对象,并执行强制类型转换。

② 调用远程方法。

具体代码如下:

import java.rmi.Naming;
public class RmiClient {
      public static void main(String[] args) throws Exception{
            Server ser = (Server)Naming.lookup("rmi://:9000/rmi");
            System.out.println(ser.hello("ti"));
            System.out.println(ser.getPerson("ti",40));
      }
}


程序的运行结果如下:

Hello ti
Person@1c0e45a


客户端使用JNDI查找到服务对象后,将其强制转换为远程接口的类型,接下来就可以直接调用方法了。需要注意的是,远程接口的方法返回值要在网络上传输,所以要求返回值可以实现序列化。所以Person类实现了Serializable接口。

该贴被xiuwen.zhao编辑于2014-8-26 16:36:20

该贴由koei123转至本版2015-6-2 8:56:17




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论