Java.RMI远程方法调用

  • RMI(Remote Method Invocation,远程方法调用)是Java进行调用远程对象的一种技术,基于Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。
  • 形象来说,就是你把服务端的对象写好、绑定到某个端口,就可以在客户端访问这个对象的方法了
  • 客户端需要知道的有ip和端口,以及绑定名
  • 客户端有怎么知道对象有什么方法呢?这里有Remote对象来标记,即实现了Remote对象的方法才可以被远程调用,这是客户端和服务端都需要知道的内容。这个Remote可以被实现为一个接口,用来进行通信。

HelloRMI

  • 这里实现一个很简单的案例,即服务端的对象是一个只会说一句话的鹦鹉,即Hello,客户端可以通过RMI听到这个鹦鹉说话。
  • 当然怎么可能是音频,只是println罢了。

1.编写Remote接口

  • Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。
  • 通过这样一个接口,客户端就知道服务端的对象有哪些方法可以调用,也可以直接通过接口来实现方法的调用
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IParrot extends Remote{
    //远程访问标记接口,只有在Remote接口中标记的方法猜可以远程调用
    public String say() throws RemoteException;
}

2.编写服务端的鹦鹉对象

  • 除了实现IParrot接口外,还必须扩展实现UnicastRemoteObject类,才能成为一只真正的远程鹦鹉
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class ParrotImpl extends UnicastRemoteObject implements hello{
    private static final long serialVersionUID = 1L;
    public ParrotImpl () throws RemoteException{  
        super();  
    }
    public String say() throws RemoteException {  
        return "Hello,I'm a parrot.";
    } 
}

3.编写服务端程序server

  • 来我们把这只鹦鹉绑定到一个端口上
  • 这里使用的IP地址是127.0.0.1即本地,只要修改成其他IP即可
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class server {
    public static void main(String[] args){
        try {
            IParrot p = new ParrotImpl();
            LocateRegistry.createRegistry(2048);//绑定端口
            Naming.bind("rmi://127.0.0.1:2048/parrot", p);//绑定对象
            System.out.println("ParrotServer启动成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4.编写客户端程序client

  • server本身作为一个进程运行
  • 这里的client是另外一个进程
  • 虽然是本地,但只要这两个进行运行在两台电脑上,同时保证ip和port对应,既可以实现真正的远程调用
import java.net.MalformedURLException;  
import java.rmi.Naming;  
import java.rmi.NotBoundException;  
import java.rmi.RemoteException; 

public class client {
    public static void main(String[] args) {  
        try {
        //获取远程对象,并利用IParrot接口来进行方法调用
            IParrot p = (IParrot)Naming.lookup("rmi://127.0.0.1:2048/parrot");
            System.out.println(p.say());  
        } catch (MalformedURLException e) {  
            System.out.println("url格式异常");  
        } catch (RemoteException e) {  
            System.out.println("创建对象异常");  
            e.printStackTrace();  
        } catch (NotBoundException e) {  
            System.out.println("对象未绑定");  
        }  
    } 
}

5.运行

  • 这一步就比较简单了,为了编译运行两个进程,个人建议在win上配置好java后进入cmd操作
  • 用linux的话直接开几个终端就好了

以win下的cmd操作为例

  • 首先进入代码所在的目录
  • 编译代码
>javac *.java
  • 运行server
>java server
ParrotServer启动成功
  • 另启一个cmd来运行client
>java client
Hello,I'm a parrot.

搞定!


  • 千变万化的服务端方法,使得远程客户端可以实现各种各样的功能
  • 目前打算练习一个传输文件的小例子作为本次的实验作业了,一个范例
  • 另有一篇详细的概念介绍,传送门
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值