【JAVA学习 RMI】

1.RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

我们知道远程过程调用(Remote Procedure Call, RPC)可以用于一个进程调用另一个进程(很可能在另一个远程主机上)中的过程,从而提供了过程的分布能力。Java 的 RMI 则在 RPC 的基础上向前又迈进了一步,即提供分布式对象间的通讯。

2.RMI的基本原理:实际上就是利用了Socket,实现了两个虚拟机之间的通信,不过这个通信不是在传统的进程,线程的层面上,而是在对象和对象之间的通信。JAVA中有相应的RMI接口,实际上和网络编程非常类似。

3.首先是公共接口,这个接口是服务端需要实现的

package Demo;

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

public interface IHello extends Remote {
    public String SayHello(String s)throws RemoteException;
}

这个接口,对于服务器来说,服务器必须实现这个接口,对于客户端的调用者来说,这就是一个信息栏,它显示了服务端有哪些功能。

4.然后是服务器端,服务器端有三个类,第一个就是公共接口,第二个是这个接口的实现:

package Demo;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements IHello {
    protected HelloImpl()throws RemoteException{
        super();
    }
    public String SayHello(String name)throws RemoteException
    {
        return "Hello "+name+"^_^";
    }
}

第三个类,就是和客户端交互使用的,运行在服务端上的主函数:

package Demo;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class HelloServer {
    public static void main(String[] args) {
        try
        {
            IHello hello=new HelloImpl();
            LocateRegistry.createRegistry(1099);
            Registry registry=LocateRegistry.getRegistry();
            registry.bind("hello",hello);
            System.out.println("Server is Ready:");
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

服务端首先产生一个对象,然后把对象绑定到一个端口。Register其实就是注册表的意思,实现了对象到地址的绑定。这里绑定的是本地主机。

然后服务端就完成了。接下来是客户端的调用

5.客户端存在两个类,第一个就是我们刚才说的那个接口类,他是为了表明服务器上这个类有哪些方法可以被调用。第二个类就是我们需要做事情的类,

package Demo;

import java.rmi.Naming;
import java.util.Scanner;
public class Hello_RMI_Client {
    public static void main(String[] args) {
        try {
            IHello hello = (IHello) Naming.lookup("rmi://localhost:1099/hello");
            Scanner cin=new Scanner(System.in);
            while(cin.hasNext()) {
                String s = cin.next();
                System.out.println(hello.SayHello(s));
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

这个类首先在对应的端口找到对象,然后调用这个对象的方法,完成远程调用。

6.RMI在分布式上应用很多,底层实现其实也很容易理解的,基本的就是Socket编程,有兴趣的可以参考这位老哥的博客,写的还是很详细的:https://blog.csdn.net/xinghun_4/article/details/45787549

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值