Java 远程调用RMI 简单实例之一
2017-08-06 10:51
204 查看
这两天在玩java的远程调用,因为之前一直没有接触过,也没有写过demo。玩起来还是走了很多弯路的,在网上搜了很多blog,很多技术大牛的blog写的很不错,但对于新手来说,有些问题还是没有讲解清楚。花了蛮多时间,终于整理出自己的一个demo。因此附上,供以后学习之用。 在java 基础讲义部分并没有提及java RMI技术,在Head First Java一书中有一章将java 提到RMI技术,但内容不多。大部分RMI技术的知识我获取渠道是网上。所列出知识点是个人能接受的。 RMI远程方法调用(Remote Method Invocation)。能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。 RMI远程调用步骤:
1,客户对象调用客户端辅助对象上的方法
2,客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象
3,服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
4,调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象
5,服务端辅助对象将结果打包,发送给客户端辅助对象
6,客户端辅助对象将返回值解包,返回给客户对象
7,客户对象获得返回值
RMI远程服务搭建步骤:
1、创建远程接口,创建远程接口并继承Remote接口。
2、实现远程接口。
3、利用rmic工具对实现类产生stub存根类和skeleton骨架类。
4、注册RMI服务。
5、启动服务。
6、编写客户端代码
看例子,在Eclipse中搭建Java项目。
服务端:
项目结构:
1、 创建远程接口:继承Remote接口,Remote接口没有任何方法,是一个标记性接口。
package com.rmi.remote; import java.rmi.Remote; import java.rmi.RemoteException; public interface RmiInterface extends Remote { /** * 远程调用服务方法 *@Date 2017年8月2日 * @param name * @return * @throws RemoteException */ public String doService(String name) throws RemoteException; /** * 远程调用sum方法 *@Date 2017年8月2日 * @param a * @param b * @return * @throws RemoteException */ public int sum(int a, int b) throws RemoteException; }
2、实现远程接口:
package com.rmi.service; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import com.rmi.remote.RmiInterface; public class ServiceImp extends UnicastRemoteObject implements RmiInterface{ /** * */ private static final long serialVersionUID = 257078182179512007L; public ServiceImp() throws RemoteException{ super(); } @Override public String doService(String name) throws RemoteException { System.out.println("your name is" + name); return name+" to"; } @Override public int sum(int a, int b) throws RemoteException { return a+b; } }
这里实现类继承了UnicastRemoteObject ,目的是将接口连接至RMI系统。这也是创建远程对象最简单的方式。实现类也可以不继承UnicastRemoteObject,而是直接利用在实现类中调用UnicastRemoteObject的exportObject(Object obj,int port),注意一定要指定port,可以达到相同的效果。
3、利用rmic工具对实现类产生stub存根类和skeleton骨架类。
jdk1.2以后的RMI可以通过反射API可以直接将请求发送给真实类,所以不需要skeleton类了
在eclipse中这步骤不需要做,我在搭建项目的时候,没有做。
4、注册服务。
5、发布服务。
package com.rmi.register; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import com.rmi.service.ServiceImp; /** * 发布接口 * * @author Administrator * @date 2017年8月2日 */ public class Main { public static void main(String[] args) { try { ServiceImp serviceImp = new ServiceImp(); LocateRegistry.createRegistry(8888); Naming.rebind("rmi://:8888/MyService", serviceImp); System.out.println(">>INFO:远程MyService对象绑定成功!"); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
Main函数运行发布服务。
因为是本机,所以省略本机的ip,发布结果如图:
这时服务类是一直运行的。
6。编写客户端
项目结构:
客户端项目中需要有客户端辅助对象打包调用信息(变量,方法名)传送到网络。RmiInterface.java就是客户端的辅对象,包名,方法都是与服务端的远程接口一致。
package com.rmi.remote; import java.rmi.Remote; import java.rmi.RemoteException; public interface RmiInterface extends Remote { /** * 远程调用服务方法 *@Date 2017年8月2日 * @param name * @return * @throws RemoteException */ public String doService(String name) throws RemoteException; /** * 远程调用sum方法 *@Date 2017年8月2日 * @param a * @param b * @return * @throws RemoteException */ public int sum(int a, int b) throws RemoteException; }
客户端测试类:
package com.rmi.test; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import com.rmi.remote.RmiInterface; public class Main { public static void main(String[] args) { try { RmiInterface service = (RmiInterface) Naming.lookup("rmi://:8888/MyService"); System.out.println(service.doService("sb")); System.out.println(service.sum(5, 8)); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (NotBoundException e) { e.printStackTrace(); } } }
测试结果
客户端输出
服务端输出
测试成功!
相关文章推荐
- java远程调用rmi入门实例
- rmi经典实例---远程调用简单实现方式
- Java 远程调用 RMI 与Spring的整合实例
- java远程调用rmi入门实例
- 第十一篇 RMI远程方法调用之Java项目实例
- 关于java RMI框架(远程方法调用)的简单介绍
- java远程调用rmi入门实例
- RMI远程方法调用简单实例
- RMI远程方法调用的简单方法和实例
- JAVA 自带的RMI远程调用功能的实现和原理
- Java远程方法调用(RMI)机制
- java远程方法调用(RMI)
- Java的RMI(远程方法调用)的实现范例
- Java远程方法调用RMI
- RMI学习笔记(二)-----RMI远程调用实例(一)
- java中使用rmi进行远程方法调用
- Java的RMI(远程方法调用)的实现范例
- RMI(远程方法调用)实现简单的查单词功能
- 学习笔记:JAVA RMI远程方法调用简单实例
- RMI(远程方法调用)实现简单的查单词功能