RPC框架一,RMI远程调用实例
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();}@Overridepublic 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服务