Java 远程调用RMI 简单实例之一

本文介绍了Java RMI(远程方法调用)的基本工作流程,并通过一个简单实例展示了如何搭建RMI服务。从创建远程接口到实现、注册服务,再到启动客户端,详细解析每个步骤,最终实现客户端和服务端的交互。测试结果显示调用成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天在玩java的远程调用,因为之前一直没有接触过,也没有写过demo。玩起来还是走了很多弯路的,在网上搜了很多blog,很多技术大牛的blog写的很不错,但对于新手来说,有些问题还是没有讲解清楚。花了蛮多时间,终于整理出自己的一个demo。因此附上,供以后学习之用。

在java 基础讲义部分并没有提及java RMI技术,在Head First Java一书中有一章将java 提到RMI技术,但内容不多。大部分RMI技术的知识我获取渠道是网上。所列出知识点是个人能接受的。
RMI远程方法调用(Remote Method Invocation)。能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。
RMI远程调用步骤:
  1. 1,客户对象调用客户端辅助对象上的方法
    2,客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象
    3,服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
    4,调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象
    5,服务端辅助对象将结果打包,发送给客户端辅助对象
    6,客户端辅助对象将返回值解包,返回给客户对象
    7,客户对象获得返回值
    RMI远程服务搭建步骤:

  2. 1、创建远程接口,创建远程接口并继承Remote接口。
    2、实现远程接口。
    3、利用rmic工具对实现类产生stub存根类和skeleton骨架类。
    4、注册RMI服务。
    5、启动服务。
    6、编写客户端代码
    看例子,在Eclipse中搭建Java项目。
    服务端:
    项目结构:
    这里写图片描述
    1、 创建远程接口:继承Remote接口,Remote接口没有任何方法,是一个标记性接口。

package com.rmi.remote;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RmiInterface extends Remote {
    /**
     * 远程调用服务方法
     *@Date 2017年8月2日
     * @param name
     * @return
     * @throws RemoteException
     */
    public String doService(String name) throws RemoteException;
    /**
     * 远程调用sum方法
     *@Date 2017年8月2日
     * @param a
     * @param b
     * @return
     * @throws RemoteException
     */
    public int sum(int a, int b) throws RemoteException;
}

2、实现远程接口:


package com.rmi.service;

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

import com.rmi.remote.RmiInterface;

public class ServiceImp  extends UnicastRemoteObject implements RmiInterface{
    /**
     * 
     */
    private static final long serialVersionUID = 257078182179512007L;

    public ServiceImp() throws RemoteException{
        super();
    }

    @Override
    public String doService(String name) throws RemoteException {
        System.out.println("your name is" + name);
        return name+" to";
    }

    @Override
    public int sum(int a, int b) throws RemoteException {
        return a+b;
    }

}

这里实现类继承了UnicastRemoteObject ,目的是将接口连接至RMI系统。这也是创建远程对象最简单的方式。实现类也可以不继承UnicastRemoteObject,而是直接利用在实现类中调用UnicastRemoteObject的exportObject(Object obj,int port),注意一定要指定port,可以达到相同的效果。
3、利用rmic工具对实现类产生stub存根类和skeleton骨架类。
jdk1.2以后的RMI可以通过反射API可以直接将请求发送给真实类,所以不需要skeleton类了
在eclipse中这步骤不需要做,我在搭建项目的时候,没有做。
4、注册服务。
5、发布服务。


package com.rmi.register;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import com.rmi.service.ServiceImp;

/**
 * 发布接口
 * 
 * @author Administrator
 * @date 2017年8月2日
 */
public class Main {
    public static void main(String[] args) {
        try {
            ServiceImp serviceImp = new ServiceImp();
            LocateRegistry.createRegistry(8888);
            Naming.rebind("rmi://:8888/MyService", serviceImp);
            System.out.println(">>INFO:远程MyService对象绑定成功!");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

Main函数运行发布服务。
因为是本机,所以省略本机的ip,发布结果如图:
这里写图片描述
这时服务类是一直运行的。
6。编写客户端
项目结构:
这里写图片描述
客户端项目中需要有客户端辅助对象打包调用信息(变量,方法名)传送到网络。RmiInterface.java就是客户端的辅对象,包名,方法都是与服务端的远程接口一致。


package com.rmi.remote;

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

public interface RmiInterface extends Remote {

    /**
     * 远程调用服务方法
     *@Date 2017年8月2日
     * @param name
     * @return
     * @throws RemoteException
     */
    public String doService(String name) throws RemoteException;

    /**
     * 远程调用sum方法
     *@Date 2017年8月2日
     * @param a
     * @param b
     * @return
     * @throws RemoteException
     */
    public int sum(int a, int b) throws RemoteException;
}

客户端测试类:


package com.rmi.test;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import com.rmi.remote.RmiInterface;

public class Main {
    public static void main(String[] args) {
         try {
            RmiInterface service = (RmiInterface) Naming.lookup("rmi://:8888/MyService");
            System.out.println(service.doService("sb"));
            System.out.println(service.sum(5, 8));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        }
    }
}

测试结果
客户端输出
这里写图片描述
服务端输出
这里写图片描述
测试成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值