Java RMI(Remote Method Invocation) 是jdk1.2 引入的一套Java自带 RPC实现方案。
实现过程如下:
一、远程服务端
- 编写远程接口继承java.rmi.Remote 接口
- 编写远程接口实现类并继承java.rmi.server.UnicastRemoteObject 类
- 编写远程启动类,实现指定注册服务端口并注册实例到rmi注册服务器上
二、客户端
- 编写本地接口继承java.rmi.Remote 接口,与远程服务端接口保持包名参数等一致。
- 使用Naming.lookup 返回与指定名称关联的远程对象的引用
- 使用引用对象进行调用远程方法
三、代码实现
3.1 远程接口 service.HelloService.java
该接口需要继承java.rmi.Remote 接口
package service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloService extends Remote {
public String sayHello(String name) throws RemoteException;
}
3.2 远程接口实现service.impl.HelloServiceImpl
该实现类需要实现远程接口以及继承java.rmi.server.UnicastRemoteObject 类,实现序列化。
package service.impl;
import service.HelloService;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* @author huizi
*/
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {
public HelloServiceImpl() throws RemoteException {
}
public String sayHello(String name)throws RemoteException {
System.out.println("这是远程方法执行逻辑.........");
return name+"执行了远程方法 SayHello";
}
}
3.3 远程启动类(重点)
在该类中需要指定注册服务器的端口,以及将需要进行注册的实例进行注册操作。
package app;
import service.HelloService;
import service.impl.HelloServiceImpl;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class ServiceMain {
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
//1 启动RMI注册服务,指定端口号
LocateRegistry.createRegistry(9999);
//2,创建要被访问的远程对象实例
HelloService service = new HelloServiceImpl();
//3,把远程对象实例注册到RMI注册服务器上
Naming.bind("rmi://127.0.0.1:9999/HelloService",service);
System.out.println("服务端启动运行中....");
}
}
3.4 客户端接口
package service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloService extends Remote {
public String sayHello(String name) throws RemoteException;
}
3.5 客户端调用类
在该类中使用Naming.lookup("rmi://127.0.0.1:9999/HelloService") 获取远程对象引用,并使用客户端接口类进行远程调用。
package app;
import service.HelloService;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class ClientMain {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
HelloService helloService = (HelloService) Naming.lookup("rmi://127.0.0.1:9999/HelloService");
String resultStr = helloService.sayHello("PC客户端 ");
System.out.println(resultStr);
}
}
四、启动运行 先启动远程短,在启动客户端调用,打印如下: