RMI使用学习小结
作者:乐果Meng_501 | 来源:互联网 | 2022-03-06 21:05
RMI使用学习小结
四年前也是 Java 的 fans,也曾如火如荼的追求着 sun,追求着 java. 当然 RMI 肯定不会放过,但到目前为止还没有在任何一个项目中用过,昨天听了一个 java 老师的课,本来不去想听,可想想我交了这么多 money,最后还是去。最叫人恶心的是他讲的 RMI 一点实用价值都没有,而且有的理论也不对。真的误导人啊,学术理论和实践是不能够分离的,老师是这样的,只能靠学生自己动手丰衣足食了。昨天晚上用了一点时间,从新研究了一下 RMI。举个例子作为 RMI 学习的终结吧。 在写这篇文章前也访问了中国电信的高级工程师,根据他的介绍,RMI 有很多实现方式,而且现在他发现 RMI 在大规模分布式系统中,效率和性能不是很好。目前他带领的团队正在自行开发分布式应用。 随着 web 2.0 时代的到来,SOA 开发思想的普及应用。分布式应用,将又一次走向高潮。 RMI 开发步骤大家都很清楚,这里举个不用手动启动 rmiRegistry, 也不要指定 codebase 和web server 的例子.底层 TCP/IP 细节我们不用去管他,你就把他看成像 SOAP、JNDI 等一样的基于注册服务的东西就行了 . 1. 远程接口 import java.rmi.Remote; import java.rmi.RemoteException; public interface IRMI extends Remote { public Object invoke(ITask task) throws RemoteException; } 2.远程接口实现 /** * @author Jack.Wang * */ import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class IRMIImpl extends UnicastRemoteObject implements IRMI { protected IRMIImpl() throws RemoteException { super(); } public Object invoke(ITask task) throws RemoteException { System.out.println("注意:这是一个远程调用"); Object obj = task.doWork(); System.out.println("调用ITask.doWork()方法的返回值:" + obj.toString()); // 客户端调用,可以在服务器端播放需要的音乐 ProcessCaller.callMp3(); return obj; } } 3. 任务接口 /** * @author Jack.Wang * */ import java.io.Serializable; public interface ITask extends Serializable { public Object doWork(); } 4. 任务实现类 /** * @author Jack.Wang * */ public class TaskImpl implements ITask { public Object doWork() { System.out.println("当前程序处于远程调用中"); return Thread.currentThread().getName() + " " + new Date(System.currentTimeMillis()); } } 5.在java中调用windows程序 public class ProcessCaller { public static void callMp3() { Runtime ru = Runtime.getRuntime(); try { // 调用播放器文件播放指定MP3 Process p1 = ru .exec("C:\\Program Files\\Windows Media Player\\wmplayer D:\\Jack\\Mp3\\5.秋天不回来-王强.mp3"); } catch (Exception e) { } } } 6. Server 端代码 /** * @author Jack.Wang * */ import java.rmi.Naming; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class RMIServer { public static void registRemoteObject() throws Exception { IRMIImpl impl = new IRMIImpl(); Naming.rebind("rmi://210.43.109.25:1111/mytask", impl); System.out.println("bound success!"); } private static Registry createRegistry() { Registry registry = null; int port = 1111; try { registry = LocateRegistry.getRegistry("210.43.109.25", port); registry.list(); System.out.println("Register the exist server!"); } catch (final Exception e) { try { registry = LocateRegistry.createRegistry(port); System.out.println("Register the exist server!port=" + port); } catch (final Exception ee) { ee.printStackTrace(); } } return registry; } /** * 将对象注册到rmi服务器上 */ public static void bind() { Registry registry = null; registry = createRegistry(); try { IRMIImpl impl = new IRMIImpl(); registry.rebind("mytask", impl); System.out.println("mytask server start!"); } catch (Exception e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { try { bind(); } catch (Exception e) { e.printStackTrace(); } } } 7. Client 端代码 /** * @author Jack.Wang * */ public class RMIClient { public static void getRemoteObject() throws Exception { IRMI obj = (IRMI) Naming.lookup("rmi://210.43.109.28:1111/mytask"); // 得到远程发布的服务 TaskImpl task = new TaskImpl(); Object result = obj.invoke(task); // 调用远程服务的方法 System.out.println(result.toString()); } public static void main(String[] args) { try { getRemoteObject(); } catch (Exception e) { e.printStackTrace(); } } } 小结: 建议把以上程序打包成 jar 文件,你可以在不同机子间测试。 RMI 就这么简单,如果你觉得他不爽,就自己封装 socket. 到时候要通知我哦,我也学习学习。
推荐阅读
本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ...
[详细]
蜡笔小新 2023-12-10 17:10:24
本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ...
[详细]
蜡笔小新 2023-12-14 13:59:45
本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ...
[详细]
蜡笔小新 2023-12-14 17:03:58
关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ...
[详细]
蜡笔小新 2023-12-13 21:02:32
本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ...
[详细]
蜡笔小新 2023-12-12 12:55:55
本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ...
[详细]
蜡笔小新 2023-12-12 10:56:24
本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ...
[详细]
蜡笔小新 2023-12-14 15:47:35
本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ...
[详细]
蜡笔小新 2023-12-14 15:43:50
本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ...
[详细]
蜡笔小新 2023-12-14 15:22:09
本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ...
[详细]
蜡笔小新 2023-12-14 15:08:18
本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ...
[详细]
蜡笔小新 2023-12-14 14:44:00
本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ...
[详细]
蜡笔小新 2023-12-14 14:25:33
本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ...
[详细]
蜡笔小新 2023-12-14 14:15:30
本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ...
[详细]
蜡笔小新 2023-12-14 13:40:42
本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ...
[详细]
蜡笔小新 2023-12-14 13:35:37
乐果Meng_501
这个家伙很懒,什么也没留下!