> 文章列表 > RPC框架一,RMI远程调用实例

RPC框架一,RMI远程调用实例

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服务