`
mrzhangtufu
  • 浏览: 61942 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

RMI远程方法调用使用简介

    博客分类:
  • j2se
阅读更多


1RMI主要构件:

服务器对象接口(server object interface):是java.rmi.Remote接口的子接口,用来为服务器对象定义方法。

服务器的实现(server implementation):是实现远程对象接口的一个类。

服务器对象(server object):是服务器实现的一个实例。

RMI注册处(RMI registry):是注册远程对象并为本地对象提供命名服务的一个工具。

客户程序(client program):是调用远程服务器对象的方法的一个程序。

服务器代理(server stub):是位于客户主机的一个对象,其作用相当于远程服务器对象的一个代表。

服务器主架(server skeleton):是位于服务器主机的一个对象,用于服务器代理与实际服务器对象的通信。

 

 

2RMI工作步骤:

a、在RMI注册处注册一个服务器对象。

b、客户从RMI注册处查找远程对象。

c、一旦找到远程对象,就在客户中返回它的代理。

d、远程对象可以像本地对象一样使用。客户和服务器之间的通信通过代理和主架处理。

 

JDK5中,代理和主架可以自动生成。代理位于客户端主机,当客户调用服务器对象的一个方法时,实际调用的是封装在代理中的方法,代理再负责向服务器发送参数,接收来自服务器的结果并返回给客户。

而主架位于服务器端,与代理进行通信。接收来自客户的参数,把它们传输给服务器处理,并返回结果给代理。

 

在远程调用中,没有办法传递对象的引用,因为在一台机器上的地址对不同的JVM来说毫无意义。任何对象,只要它可以序列化,就可以用作远程调用的参数。代理将对象参数序列化、并发送到网络的流中,主架对流进行解读序列化,存到对象。

 

3、客户是通过RMI注册处来定位远程对象的。RMI注册处为服务器注册对象以及为客户查找对象提供注册服务。LocateRegistry静态方法getRegistry()方法返回对Registry对象的引用。一旦获得Registry对象,就可以用bindrebind方法与注册处中的唯一名称绑定,或者使用lookup方法定位对象。

 

4、开发RMI应用程序简单步骤:

 a、定义服务器对象接口:必须是java.rmi.Remote接口的子接口,与java.io.Serializable一样,java.rmi.Remote接口也是一个标记接口,不包含任何常数和方法,仅用来标记远程对象。

       public interface ServerInterface extends Remote {

       //定义各种服务器端的方法

              public void service() throws RemoteException;//必须抛出的异常

       }

 b、定义服务器实现类:必须扩展java.rmi.server.UnicastRemoteObject,现实前面的接口。

       public class ServerInterfaceImpl extends UnicastRemoteObject

       implements ServerInterface {

              //实现服务器对象接口的各种方法

             public void service () throws RemoteException {

                     ..........

              }

       }

 c、在某个类中创建并注册服务器对象:由服务器实现类创建一个服务器对象,并注册到注册处

       ......

       ServerInterface server = new ServerInterfaceImpl();//创建一个服务器对象

       Registry registry = LocateRegistry.getRegistry();//得到注册处的引用

       registery.rebind("自定义的唯一的一个远程对象名称", server);//注册对象

       ......

 d、开发客户程序:一个查找远程对象并调用其方法的客户程序

       .........

       Registry registry = LocateRegistry.getRegistry(host);//host:服务器的主机地址

       ServerInterface server =

(ServerInterfaceImpl) registry.lookup("服务端自定义的唯一的一个远程对象名称");

       server.service();//就可以像本地对象一样使用服务端对象了。

       .........

 

5、编译使用RMI

   a、启动注册处。在DOS中输入“start rmiregistry端口号”(端口号缺省)。

   b、启动服务器对象程序。

   c、启动客户端程序。

注:必须从RMI服务器的目录启动rmiregistry,否则有ClassNotFoundException

    服务器、注册处、客户端可以处于三台不同机器,但需要将服务器对象接口分别放置在两台机器上。 如果是客户端是applet,则要将所有的客户端文件放置在注册处主机。

 

6、完整实例:

package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
 *从RMI服务器读取学生分数的服务器对象接口
 * @author Administrator
 */
public interface StudentServerInterface extends Remote{
     /**
      * return the score for the specified name
      * @param name the student name
      * @return an double score or -1 if the student is not found
      */
      public double findScore(String name) throws RemoteException;
}
 
 

package rmi;
import java.util.HashMap;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
 *RMI对象的服务器实现类
 * @author Administrator
 */
public class StudentServerInterfaceImpl extends UnicastRemoteObject
implements StudentServerInterface{
    private HashMap scores = new HashMap();
 
    public StudentServerInterfaceImpl() throws RemoteException{
        initializeStudent();
    }
    protected void initializeStudent(){
        scores.put("tufu", new Double(99.0));
        scores.put("tao", new Double(89.3));
        scores.put("bing", new Double(83.3));
    }
    /*Implement the findscore method from the student interface*/
    public double findScore(String name) throws RemoteException {
        Double d = (Double)scores.get(name);
        if(d == null){
            System.out.println("Student "+name+" is not found");
            return -1;
        }
        else{
            System.out.println("Student "+name+"\'s score is "+d.doubleValue());
            return d.doubleValue();
        }
    }
}
 
 

 

 

package rmi;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
/**
 *从服务器实现类创建一个服务器对象,并在RMI服务器注册它
 * @author Administrator
 */
public class RegisterWithRMIServer {
    /*main method
      负责启动服务器*/
    public static void main(String args[]){
        try{
            //创建服务器对象
            StudentServerInterface obj = new StudentServerInterfaceImpl();
            //获得RMI注册处的引用
            Registry registry = LocateRegistry.getRegistry();
            //在注册处注册对象
            registry.rebind("StudentServerInterfaceImpl", obj);
            System.out.println("Student server "+obj+" registered");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
 
 

 

 

package rmi.client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import rmi.StudentServerInterface;
/**
 *创建一个RMI客户,用来调用RMI服务端的方法
 * @author Administrator
 */
public class StudentServerInterfaceClient extends JApplet{
    //Declare a student instance
    private StudentServerInterface student;
 
    private boolean isStandalone; //Is applet or application
 
    private JButton jbtGetScore = new JButton("Get Score");
    private JTextField jtfName = new JTextField();
    private JTextField jtfScore = new JTextField();
 
    public void init(){ //Applet的初始化方法
        initializeRMI(); //initial RMI
 
        JPanel jPanel1 = new JPanel();
        jPanel1.setLayout(new GridLayout(2,2));
        jPanel1.add(new JLabel("Name"));
        jPanel1.add(jtfName);
        jPanel1.add(new JLabel("Score"));
        jPanel1.add(jtfScore);
 
        this.add(jbtGetScore,BorderLayout.SOUTH);
        this.add(jPanel1,BorderLayout.CENTER);
 
        jbtGetScore.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                getScore();
            }
        });
    }
 
    private void initializeRMI(){
        String host = "";
        if(!isStandalone) host = getCodeBase().getHost(); //用Applet的方法获取调用该applet的主机
 
        try{
            Registry registry = LocateRegistry.getRegistry(host);
            student = (StudentServerInterface)registry.lookup("StudentServerInterfaceImpl");
            System.out.println("Server Object "+student+" found");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
 
    private void getScore(){
        try{
            double score = student.findScore(jtfName.getText().trim());
            if(score < 0)
                jtfScore.setText("Not found");
            else
                jtfScore.setText(new Double(score).toString());
        }catch(Exception e){
            e.printStackTrace();
        }
    }
 
    /*Main method*/
    public static void main(String args[]){
        StudentServerInterfaceClient applet =
                new StudentServerInterfaceClient();
        applet.isStandalone = true;
        JFrame frame = new JFrame();
        frame.setTitle("StudentServerInterfaceClient");
        frame.add(applet,BorderLayout.CENTER);//fram可以嵌入applet
        frame.setSize(250,150);
        applet.init();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(3);
        frame.show();
    }
 
}
 

0
0
分享到:
评论

相关推荐

    RMI远程方法调用RMI远程方法调用

    RMI远程方法调用是Java平台上的一个关键特性,它允许Java对象在不同的JVM之间进行通信,从而实现分布式计算。RMI的核心理念是让开发者能够像调用本地方法一样调用远程对象的方法,简化了分布式系统的设计和实现。 *...

    java rmi远程方法调用 客户端

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间透明地调用...理解并掌握RMI的工作原理和使用方法,对于构建可扩展的Java应用程序至关重要。

    Java RMI 远程方法调用

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...

    Java RMI远程方法调用详解-例子代码

    首先,我们需要定义一个实现了`java.rmi.Remote`接口的类,比如`MyRemoteInterface.java`,并在这个接口中声明所有需要远程调用的方法。这些方法必须抛出`java.rmi.RemoteException`,因为网络通信可能会出现异常。...

    Java RMI(远程方法调用)Demo

    1. **创建远程接口**:定义一个继承自Remote的接口,声明需要远程调用的方法。 2. **实现远程接口**:编写一个类实现这个接口,提供具体的方法实现。 3. **注册远程对象**:在服务器端创建远程对象实例,然后将其...

    RMI远程调用代码及使用方法

    ### RMI远程调用代码及使用方法 #### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,它允许开发人员在不同的Java虚拟机(JVM)之间进行对象的远程调用。通过...

    RMI 远程方法调用.zip

    - **远程接口(Remote Interface)**:定义了可以被远程调用的方法,使用`@Remote`注解标识。 - **远程实现(Remote Implementation)**:实现了远程接口的类,包含远程方法的具体实现。 - **导出(Export)**:...

    rmi 远程方法调用

    RMI(Remote Method Invocation,远程方法调用)是Java中的一种技术,允许一个Java对象调用另一个在不同JVM(Java虚拟机)上的对象的方法。RMI是Java分布式计算的基础,它使得Java程序可以在网络环境中进行通信和...

    Java RMI远程方法调用

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像调用本地方法一样。RMI系统的核心概念是客户端可以调用服务器端的对象上...

    java rmi 远程方法调用 服务端

    1. 远程接口(Remote Interface):定义了可以被远程调用的方法,这些方法必须声明抛出`java.rmi.RemoteException`。接口需要使用`@Remote`注解标记。 2. 远程实现类(Remote Implementation):实现了远程接口,并...

    ssd8 exercise4 RMI远程方法调用

    因此,通常会定义一个公共接口,该接口声明了可被远程调用的方法。 3. **实现远程接口**:然后,创建一个实现了远程接口的类,并且这个类需要使用`java.rmi.Remote`作为父接口。实现类必须抛出`java.rmi....

    spring RMI 远程接口调用

    Spring RMI(Remote Method Invocation)远程接口调用是Spring框架提供的一个特性,它允许你在分布式环境中调用对象的方法,使得应用程序能够跨越网络边界操作远程对象。这个技术在大型企业级应用中尤其有用,因为它...

    使用rmi进行远程调用

    4. **导出远程对象**:使用`java.rmi.server.UnicastRemoteObject`的`exportObject()`方法将`BankServiceImpl`实例导出为远程对象,使其可以被远程调用。 5. **启动RMID服务**:确保服务器上运行着RMID守护进程,它...

    RMI远程过程调用(远程文件管理)

    java jdk1.8; eclipse 开发环境;实现A机器的程序,可以管理(增加、删除、改等)B机器上的某个文件夹或者目录;掌握远程过程调用原理,基于...客户端利用RMI实现远程调用服务。同时,在在两台机器之间验证结果正确。

    RMI远程过程调用

    RMI采用JRMP(Java Remote Method Protocol)通讯协议,是构建在TCP/IP协议上的一种远程调用方法。它允许运行在一个Java虚拟机上的对象调用运行在另一个Java虚拟机上的对象方法,从而使编程人员可以方便地在网络环境...

    三种方式实现java远程调用(rmi),绝对可用

    在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。在MyEclipse或其他Java开发环境中导入这些代码,可以进行调试和...

    rmi远程接口调用

    3. **注册远程对象(Registering the Remote Object)**:在服务端,使用`java.rmi.registry.Registry`接口的`bind`方法将远程对象与一个名字绑定,这样客户端可以通过这个名字查找对象。 4. **启动RMIServer**:...

    RMI远程方法调用讲解教程

    7. **远程调用层(Remote Call Layer)**:这是处理网络通信的底层机制,它使用TCP/IP协议来传输数据。当客户端的占位程序调用一个远程方法时,调用会被封装并发送到服务器端的骨架,骨架解封装后执行相应的方法。 ...

Global site tag (gtag.js) - Google Analytics