一、创建Maven Project
1.rmi-rescource 提供远程服务对象接口
2.rmi-provider 提供远程项目
3.rmi-customer 消费远程项目
二、代码实现
1.rmi-resource
package com.facai.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
/*
* 创建需要发布的服务对应的业务接口
* Remote接口用于标识可以从非本地虚拟机调用的接口
*/
public interface UserService extends Remote{
public String helloRmi(String name) throws RemoteException;
}
2.rmi-provider
提供远程服务的对象UserServiceImpl
package com.facai.service.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.facai.service.UserService;
/*
* 发布的服务对应的实现类
*/
public class UserServiceImpl extends UnicastRemoteObject implements UserService {
public UserServiceImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
@Override
public String helloRmi(String name) throws RemoteException {
// TODO Auto-generated method stub
return "hello"+name;
}
}
启动类
package com.facai.app;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import com.facai.service.UserService;
import com.facai.service.impl.UserServiceImpl;
public class ProviderApp {
public static void main(String[] args) {
/*
* 完成远程服务的发布
* 将远程服务发布在本地的8888端口
*/
try {
LocateRegistry.createRegistry(8888);
//远程服务访问的url
String name="rmi://localhost:8888/rmi";
//创建一个提供具体服务的对象
UserService userService=new UserServiceImpl();
//给提供远程服务的对象提供url
Naming.bind(name,userService);
System.out.println("======发布rmi远程服务======");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.remi-customer
package com.facai.app;
import java.rmi.Naming;
import java.rmi.Remote;
import com.facai.service.UserService;
public class CustomerApp {
public static void main(String[] args) {
try{
//发布的远程服务的访问url
String name="rmi://localhost:8888/rmi";
//通过发布的远程服务的url,获得远程服务的代理对象
UserService userService=(UserService) Naming.lookup(name);
System.out.println("获得的远程服务的代理对象"+userService.getClass().getName());
//通过远程服务的代理对象调用远程服务方法
String result=userService.helloRmi("rmi");
System.out.println("result="+result);
}catch(Exception e){
e.getStackTrace();
}
}
}
注:rmi-provider和rmi-customer要对rmi-resource添加依赖
**
三、使用到的API
**
Remote接口:标识某个方法可以被远程调用|
UnicastRemoteObject类:实现Remote远程对象的导出
Naming:给提供远程服务的对象绑定url
通过远程的url,获得提供远程服务的代理对象
LocalRegistry类:指定发布远程服务的方法接口