RMI介绍:

RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

--引用自搜搜百科

一、服务器端

1.新建一个Java项目“MyRmiService”;

2.建包“com.rmi.bin”;

3.建立一个主入口的接口“IRmiService.java”,并公开一个远程调用方法“hello”。代码如下:

package com.rmi.bin;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IRmiService extends Remote {
    /**
     * 公开远程调用方法hello
     * @param userName
     * @return
     */
    public String hello(String userName) throws RemoteException;
}

4.编写实现类“RmiService.java”,并覆写hello方法。代码如下:

package com.rmi.bin;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class RmiService extends UnicastRemoteObject implements IRmiService {
    private static final long serialVersionUID = -8306441060593704819L;
    protected RmiService() throws RemoteException {
        super();
    }
    @Override
    public String hello(String userName) throws RemoteException{
        return "你好~"+userName+"!";
    }
}


5.启动服务端。新建“StartService.java”。代码如下:

package com.rmi.bin;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class StartService {
                                      
    public static void startService() {
        String host ="127.0.0.1";//公开的ip地址
        String port ="8999";//公开的端口
        try {
            IRmiService service = new RmiService();
            LocateRegistry.createRegistry(Integer.valueOf(port));// 本地主机上的远程对象注册表Registry的实例,并指定端口为8999
            // 把远程对象注册到RMI注册服务器上,并命名为RmiService
            // 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
            Naming.bind("rmi://" + host + ":" + port + "/RmiService", service);
            System.out.println(">>>>>INFO:远程RmiService对象绑定成功!");
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            e.printStackTrace();
        }
    }
                                      
                                      
    public static void main(String[] args) {
        startService();
    }
}


6.运行main方法。运行结果如下图:

RMI服务端和客户端示例_第1张图片

二、客户端

1.新建一个Java项目“MyRmiClient”;

2.建包“com.rmi.bin”;(和服务器端一致)

3.建立一个主入口的接口“IRmiService.java”,并公开一个远程调用方法“hello”。代码如下:

package com.rmi.bin;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IRmiService extends Remote {
    /**
     * 公开远程调用方法hello
     * @param userName
     * @return
     */
    public String hello(String userName) throws RemoteException;
}


4.调用服务端hello接口。代码如下:

package com.rmi.bin;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
public class LinkService {
    /**
     * 调用远程Hello方法
     * @param userName
     * @throws RemoteException
     */
    public static void linkHello(String userName) throws RemoteException {
        String host = "127.0.0.1";
        String port = "8999";
        try {
            Remote remote = Naming.lookup("rmi://" + host + ":" + port
                    + "/RmiService");
            if (remote instanceof IRmiService) {
                IRmiService rmiService = (IRmiService) remote;
                String result = rmiService.hello(userName);
                System.out.println(result);
            }
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
                    
                    
    public static void main(String[] args) {
        try {
            linkHello("lion");
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

5.运行客户端main方法,调用结果如下:

RMI服务端和客户端示例_第2张图片



至此,一个简单的RMI服务端和客户端搭建完毕!(源代码已公布,请在“附件下载”中下载)