Java RMI 入门 – [无坑篇]
Introduction
JavaRMI用于不同虚拟机之间的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上;一个虚拟机中的对象调用另一个虚拟上中的对象的方法,只不过是允许被远程调用的对象要通过少量标志加以标识。这样做的特点如下:
优点:避免重复造轮子; 缺点:调用过程很慢,而且该过程是不可靠的,容易发生不可意料的错误,比方网络错误等;
在RMI中的核心是远程对象(remote object),除了对象本身所在的虚拟机,其余虚拟机也可以调用此对象的方法,而且这些虚拟机可以不在同一个主机上。每个远程对象都要实现一个或者者多个远程接口来标识自己,公告了可以被外部系统或者者应用调用的方法(当然也有少量方法是不想让人访问的)。
从网上阅读了无数rmi demo和 paper,存在各种各样的坑,搞了一下午,终于填完,下方代码保证能够运行:
GreetService.java 接口文件:
packagecom.jd.rmidemo.service;importjava.rmi.RemoteException;publicinterfaceGreetServiceextendsjava.rmi.Remote{StringsayHello(String name)throwsRemoteException;}
GreetServiceImpl.java 具体实现:
packagecom.jd.rmidemo.service;importjava.rmi.RemoteException;publicclassGreetServiceImplextendsjava.rmi.server.UnicastRemoteObjectimplementsGreetService{privatestaticfinallong serialVersionUID =3434060152387200042L;? ? publicGreetServiceImpl()throwsRemoteException{super();? ? }@OverridepublicStringsayHello(Stringname)throwsRemoteException{return”Hello “+ name;? ? }}
Server.java ? 远程部署的RMI Server文件:
packagecom.jd.rmidemo.main;importcom.jd.rmidemo.service.GreetServiceImpl;importjava.rmi.registry.LocateRegistry;importjava.rmi.registry.Registry;publicclassServer{publicstaticvoidmain(String[] args){try{// 2333是RMI Service监听的端口Registry registry = LocateRegistry.createRegistry(2333);? ? ? ? ? ? registry.bind(“test”,newGreetServiceImpl());? ? ? ? ? ? System.out.println(“server is ready”);? ? ? ? }catch(Exception e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }? ? }}
Client.java 连接文件:
package com.jd.rmidemo.main;importcom.jd.rmidemo.service.GreetService;importjava.rmi.registry.LocateRegistry;importjava.rmi.registry.Registry;publicclassClient{publicstaticvoid main(String[] args) {try{Registryregistry =LocateRegistry.getRegistry(“Server服务器IP”,2333);// 注册列表for(Stringv : registry.list()){System.out.println(v);? ? ? ? ? ? }GreetServicegreetService = (GreetService)registry.lookup(“test”);//注:通过接口拿System.out.println(greetService.sayHello(“Jobs”));? ? ? ? }catch(Exceptione) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }? ? }}
为什么网上很多demo都跑不成功呢? 其中最大的问题是hostname起因,由于:
用户端程序向服务端请求一个对象的时候,返回的stub对象里面包含了服务器的hostname,用户端的后续操作根据这个hostname来连接服务器端。 网上执行rmiregistry命令 起到的作用只是为了方便client获取到stub对象,假如还有其余的方法让client拿到stub就不需要RMIRegistry 了,由于client一旦拿到了stub就不需要RMIRegistry了,如上,我们的LocateRegistry.createRegistry就已经完成这步骤操作了。
假如你的Server.java部署在远程服务器,那么需要手动指定 java.rmi.server.hostname=, 例: java -Djava.rmi.server.hostname=118.24.75.130 -jar rmidemo.jar
进群:697699179可以获取Java各类入门学习资料!
这是我的微信公众号【编程study】各位大佬有空可以关注下,每天升级Java学习方法,感谢!
学习中遇到问题有不明白的地方,推荐加小编Java学习群:697699179内有视频教程 ,直播课程 ,等学习资料,期待你的加入
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Java RMI 入门 – [无坑篇]