RPC框架一,RMI远程调用实例

RMI简单介绍

1)RMI(remote method invocation)是java原生支持的远程调用,RMI采用JRMP(java RemoteMessageing Protocol)作为通信协议。可以认为是纯java版本的分布式远程调用解决方法。

2)RMI的核心概念

3)RMI实现步骤

1、创建远程接口,并继承java.rmi.Remote接口

2、实现远程接口,并继承:UnicastRemoteObject

3、创建服务器程序,createRegistry() 方法注册远程对象

4、创建客户端程序,(获取注册信息,调用接口方法)

 

RPC框架一,RMI远程调用实例

网上找了好久关于RMI调用的实例,大多都是本地调用的,远程调用的示例很少,所以自己整理一版。

首先 从server端开始

服务端###############

具体步骤:

1,写个RMI接口 MyRmiService.java

2,写个RMI接口实现 MyRmiServiceImpl.java

3,写个RMI服务端程序  RmiSeverTest.java(main方法,注意此类需要和RMI接口实现在同个包下,或者子包中,原因是接口实现的无参构造器是protected权限)

具体代码:

MyRmiService.java---------------------------------------------------------
package com.rmi.service;

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

public interface MyRmiService  extends Remote {
    public String sayHello () throws RuntimeException, RemoteException;
}

MyRmiServiceImpl.java----------------------------------------------------------------------------------

package com.rmi.service.impl;

import com.rmi.service.MyRmiService;

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

public class MyRmiServiceImpl  extends UnicastRemoteObject implements MyRmiService {
    private static final long serialVersionUID = 1L;
    protected MyRmiServiceImpl() throws RemoteException {
        super();
    }
    @Override
    public String sayHello() throws RemoteException {
        return "Hello world";
    }
}
RmiSeverTest.java----------------------------------------------------------------------
package com.rmi.service.impl;

import com.rmi.service.MyRmiService;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class RmiSeverTest {
    private static final String START_FAIL = "MyRmiService start error";
    private static final String START_SUCC = "MyRmiService start success";
    private static final int RMI_SERVER_PORT = 1099;
    private static final String RMI_SERVER_NAME ="rmi://10.206.66.166:1099/sayHello";
    private static final String START_INFO =",waste time(ms) ";

    public static void main(String[] args) {
        boolean runSucc = true;
        //创建服务
        long begintime = System.currentTimeMillis();
        try {
            LocateRegistry.createRegistry(RMI_SERVER_PORT);
            // 以下是向LocateRegistry注册(绑定/重绑定)RMI Server实现。
            MyRmiService myRmiService = new MyRmiServiceImpl();
            // 通过java 名字服务技术,可以讲具体的RMI Server实现绑定一个访问路径。注册到LocateRegistry中
            Naming.rebind(RMI_SERVER_NAME, myRmiService);

        } catch (Exception e) {
            runSucc = false;
            e.printStackTrace();
        }
        long endtime = System.currentTimeMillis();
        System.out.println((runSucc?START_SUCC:START_FAIL)+START_INFO +(endtime -begintime));
    }
}

启动main方法,则客户端正常启动了

现在我们就可以远程调用了,但是在写客户端代码之前我们需要准备客户端代理,

远程客户端############

生成客户端代理class  MyRmiServiceImpl_Stub.class----->具体步骤如下:

当前项目的target\classes目录下(C:\Users\zxx\IdeaProjects\testProject\target\classes)

执行cmd命令到控制台

在控制台执行命令 rmic com.rmi.service.MyRmiServiceImpl 生成MyRmiServiceImpl_Stub.class文件

命令行提示如下:

将项目打包为rmi-sub-1.0.0.jar (去除其他文件,仅保留必须的MyRmiService.class,MyRmiServiceImpl_Stub.class两个文件)

客户端导入此jar包,开始书写客户端调用类 ClientRmiTest.java

package com.rmi.test;

import com.rmi.service.MyRmiService;

import javax.naming.NamingException;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;


public class ClientRmiTest {
    public static void main(String[] args) throws NamingException, RemoteException, NotBoundException, MalformedURLException {
        System.out.println( ((MyRmiService) Naming.lookup("rmi://10.206.66.166/sayHello")).sayHello());
    }
}

执行main方法远程调用RMI服务

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值