Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427373
  • 博文数量: 79
  • 博客积分: 2886
  • 博客等级: 少校
  • 技术积分: 968
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-16 10:33
文章分类

全部博文(79)

文章存档

2013年(7)

2012年(17)

2011年(28)

2010年(25)

2009年(1)

2008年(1)

我的朋友

分类: Java

2011-04-06 17:16:40

1RMI定义和功能

RMIRemote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远 Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都 像本地对象一样。


2使用RMI技术共有6个步骤 

(1)定义和实现远端接口中的参数 (2) 定义和实现远端接口 (3) 编写服务端代码 (4)编写客户端代码 (5)生成stubskeltion ,并将stub打包到客户端jar中,将skeltion打包到服务端jar中 (6)启动rmiregistry , 并将服务注册到rmiregistry中,然后运行代码。


3.Stub和skeleton

Stub存根包含将客户端请求传送到服务器、处理从服务器传回的结果和将结果返给客户机的代码。

skeleton骨架在服务器端,代理接收客户机的远程调用,将它们转换成在服务器上的本地调用,进行本地调用并将结果传回客户机。

JDK5.0以后,这两个类就不需要rmic来产生了,而是有JVM自动处理,实际上他们还是存在的。Stub存在于客户端,作为客户端的代理,让我们总是认为客户端产生了stub,接口没有作用。实际上stub类是通过Java动态类下载 机制下载的,它是由服务端产生,然后根据需要动态的加载到客户端,如果下次再运行这个客户端该存根类存在于classpath中,它就不需要再下载了,而是直接加载

3Riregistry介绍

Rmiregistry需要在提供远程对象服务端启动,它提供了一个环境,说白了就是在内存中,开辟了一片空间,用来接受服务端服务程序的注册,产生一个类似于数据库,提供存储检索远程对象功能的注册表。这个RMI注册表,就是我们常听到的RMI名字服务。远程客户端,就是依靠它获得存根,调用远程方法。说到 这里有一个端口的问题,如果你在启动rmiregistry时,设定了非默认端口,那么需要在服务端和客户端统一使用该端口,否则就会有RemoteException的异常抛出,rmiregistry 供的服务是针对特定的端口号的,不然在同一台机器上也是无法提供服务。

4.实例



(1).  RMI最简单的一个实例,思路是你在服务器端创建一个方法addData(),该方法实现两个整数的相加,然从客户端远程调用这个方法实现相加功能

 

(2)  .我们一步一步来实现,首先定义远程接口-----远程接口类

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

public interface AddServer extends Remote{
    public int addData(int a,int b)throws RemoteException;
}


 

(3)  .定义和实现服务器中远程方法-----服务器类

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
////注意要扩展UnicastRemoteObject类

public class AddServerImpl extends UnicastRemoteObject implements AddServer{

    public AddServerImpl()throws RemoteException
    {
           super();
    }
    public int addData(int a,int b)throws RemoteException
    {
           return a+b;
    }
    public static void main(String s[])
    {
           try
           {
                  //创建该远程对象

                  AddServerImpl instance=new AddServerImpl();
                  //注册该远程对象

                  Naming.rebind("add",instance);
                  System.out.println("Server Registered");
           }
           catch(Exception e){System.out.println(e);}
    }

}


 

(4)  .定义与实现客户-----客户类




import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.Naming;


public class AddClient
{
       public AddClient()
       {
              try
              {
                     BufferedReader input=new BufferedReader(newInputStreamReader(System.in));
                     System.out.println("Please enter first number:");
                     System.out.flush();
                     String s=input.readLine();
                     int num1=Integer.parseInt(s);
                     System.out.println("Please enter second number:");
                     System.out.flush();
                     s=input.readLine();
                     int num2=Integer.parseInt(s);
                    
                     AddServer addserver=(AddServer)Naming.lookup("rmi://127.0.0.1/add");
                    
                     int i=addserver.addData(num1,num2);
                     System.out.print("Result is:"+i);
                    
              }
              catch(Exception e){System.out.println(e);}
       }
       public static void main(String s[])
       {
              new AddClient();
       }
}


 

(5)  .编译javac *.java

 

(6)  .生成StubSkeleton

在命令提示符下:rmic  AddServerImpl

这时你会发现在文件夹中多了AddServerImpl_Stub.class

 

(7)  .创建安全策略

修改JDK安装目录下的文件lib\security\java.policy 在文件最后面加上

grant{

        permission java.security.AllPermission "","";

};

(8)  .启动RMI远程注册表

AddServerImpl_Stub所在文件夹路径添加到classpath路径:set classpath=%classpath%;D:\rmiDemo

在命令提示符下:start  rmiregistry

 

(9)  .启动服务器

在命令提示符下:java  AddServerImpl


(10)  .启动客户

在命令提示符下:java  AddClient

(11)  .如果你是在自己机器上调试的话,那么到第九步就可以了,如果你在两台机器上调试的话,需要改一下AddClient代码中的IP地址,并且把AddClient.classAddServer.classAddServerImpl_Stub.class放到你打算作为客户端的那台机器上去,注意其它文件不要放,否则你就等于把服务端代码都告诉别人了。

 




阅读(522) | 评论(0) | 转发(0) |
0

上一篇:FTP上传下载应用

下一篇:Java Socket编程

给主人留下些什么吧!~~