RMI vs Socket
一般来说,基于CS(client-server)软件架构的开发技术有很多种。比较常用的有:基于socket的网络编程、RPC、基于 Java技术的 RMI(当然C#也有类似技术)、CORBA等。在这里我们只是对基于socket的网络编程与RMI作个对比,有助于我们了解它们各自的应用领域,帮助 我们在面对一个具体问题的时候选用适合的技术。另外,本文所做的讨论可以认为是脱离了语言层面的东西,只是对技术的本身做一个讨论,无关乎你是用C++、 C#或Java 在开发。
一、RMI技术简介
本文就以Java为例,简单介绍一下RMI技术。
从Java1.1开始,远程方法调用作为Java分布式对象技术成为Java核心的API之一(在java.rmi.* 包)。RMI的引入,使得Java程序之间能够实现灵活的,可扩展的分布式通信。RMI允许Java对象存在于多个不同的地址空间,分布在不同的Java 虚拟机上。每一个地址空间可以在同一台主机上或者网络上不同的计算机上。由于远程方法调用跨越不同的虚拟机边界到不同的指定的地址空间,所以没有对象共享 的全局变量,这就需要对象序列化(Object Serialization)API,它使得Java对象能够在不同的JVM之间传递。对象序列化是特别为Java的对象设计的,这就意味着Java程序 中的对象可以作为对象参数存取(可序列化的对象必须实现Serializable接口)。结合RMI和对象序列化机制,就可以访问越过本地Java虚拟机 边界的对象以及数据。通过RMI,可以调用远程对象的远程方法,而通过Java对象序列化机制可以将对象传递给这些方法。
最基本的Java模型并没有提供将远程主机上的Java对象看作本地Java程序地址空间一部分的能力,而RMI祢补了这一不足。另外,由于Java与硬件平台无关的特性,无论是同构的系统还是异构的系统,RMI不需移植就可以顺利运行。
RMI为Java平台的分布式计算提供了一个简单而直接的模型。因为Java的RMI技术是基于Java平台的,所以它将Java平台的安全性和可移植性 等优点带到了分布式计算中。RMI大大扩展Java的网络计算能力,它为编写基于分布式对象技术的企业级Internet/Intranet应用提供了强 大的系统平台支持。
Java RMI体系结构如下图:
二、基于socket的网络编程
当你使用socket进行网络应用开发的时候,一般的思路是“消息驱动逻辑”,即这样的软件系统一般具有以下特点:
(1) 客户端与服务器端依靠消息进行通讯。
(2) 客户端或者服务器端都需要一个消息派遣器,将消息投递给具体的massage handler
(3) 客户端或者服务器端利用massage handler进行逻辑事务处理
见下图:
使用socket开发的软件系统,从技术的本质上来讲,有以下几个特点:
(1) 基于TCP协议的通讯
(2) 应用程序本身需要提供对消息的序列化处理(所谓的序列化指的是将消息输出到网络流中)
(3) 客户端与服务器端需要事先商议好它们之间的通讯协议即它们交互的消息格式
(4) 由于是消息驱动逻辑,从本质上决定了这样的编程模式很难面向对象化
三、RMI Vs Sochet
RMI技术比较socket的网络编程主要有以下几个方面:
第一、.RMI是面向对象的,而后者不是。
第二、.RMI是与语言相绑定的。比如当你使用Java RMI技术的时候,客户端与服务器端都必须使用Java开发。而socket的网络编程是使用独立于开发语言的,甚至独立于平台。基于socket的网络 编程,客户端与服务器端可以使用不同开发语言和不同的平台。
第三、从网络协议栈的观点来看,RMI与socket的网络编程处于不同层次上。基于socket的网络编程位于TCP协议之上,而RMI在TCP协议之 上,又定义了自己的应用协议,其传输层采用的是Java远程方法协议(JRMP)。可见,在网络协议栈上,基于RMI的应用位置更高一些,这也决定了,与 socket的网络编程相比,RMI会丧失一些灵活性和可控性,但是好处是它带给了应用开发者更多的简洁,方便和易用。比如:如果你用的是RMI,你不需 要关心消息是怎么序列化的,你只需要像本地方法调用一样,使用RMI。代价是:应用开发者无法很好地控制消息的序列化机制。
第四、这是最后一点不同,我认为也是比较重要的一点,就是两种方法的性能比较,其往往决定着你将使用那种技术来开发你的应用。以下引用Adrian Reber在Network-programming with RMI文中对TCP和RMI所做的一个比较,其做的实验主要是对两者在网络传输的带宽上作的对比: 在网络上传输2 byte的有效数据,对于TCP而言,总共有478 byte被额外传输,而对于RMI, 1645byte被额外传输。以下是两者的trace结果:
TCP: 46037 > 12345 [SYN] Seq=801611567 Ack=0 Win=5840 Len=0 12345 > 46037 [SYN, ACK] Seq=266515894 Ack=801611568 Win=10136 Len=0 46037 > 12345 [ACK] Seq=801611568 Ack=266515895 Win=5840 Len=0 12345 > 46037 [PSH, ACK] Seq=266515895 Ack=801611568 Win=10136 Len=1 46037 > 12345 [ACK] Seq=801611568 Ack=266515896 Win=5840 Len=0 12345 > 46037 [FIN, PSH, ACK] Seq=266515896 Ack=801611568 Win=10136 Len=1 46037 > 12345 [RST, ACK] Seq=801611568 Ack=266515898 Win=5840 Len=0 RMI: 42749 > rmiregistry [SYN, ECN, CWR] Seq=3740552479 Ack=0 Win=32767 Len=0 rmiregistry > 42749 [SYN, ACK, ECN] Seq=3749262223 Ack=3740552480 Win=32767 Len=0 42749 > rmiregistry [ACK] Seq=3740552480 Ack=3749262224 Win=32767 Len=0 JRMI, Version: 2, StreamProtocol rmiregistry > 42749 [ACK] Seq=3749262224 Ack=3740552487 Win=32767 Len=0 JRMI, ProtocolAck 42749 > rmiregistry [ACK] Seq=3740552487 Ack=3749262240 Win=32767 Len=0 Continuation rmiregistry > 42749 [ACK] Seq=3749262240 Ack=3740552506 Win=32767 Len=0 JRMI, Call rmiregistry > 42749 [ACK] Seq=3749262240 Ack=3740552556 Win=32767 Len=0 JRMI, ReturnData 42749 > rmiregistry [ACK] Seq=3740552556 Ack=3749262442 Win=32767 Len=0 JRMI, Ping JRMI, PingAck 42749 > rmiregistry [ACK] Seq=3740552557 Ack=3749262443 Win=32767 Len=0 JRMI, DgcAck 42749 > rmiregistry [FIN, ACK] Seq=3740552572 Ack=3749262443 Win=32767 Len=0 rmiregistry > 42749 [FIN, ACK] Seq=3749262443 Ack=3740552573 Win=32767 Len=0 42749 > rmiregistry [ACK] Seq=3740552573 Ack=3749262444 Win=32767 Len=0
实验的结果是:RMI与TCP based socket相比,传输相同的有效数据,RMI需要占用更多的网络带宽(protocol overhead)。从这里,我们可以得出一个一般性的结论:RMI主要是用于远程方法的”调用“(RMI是多么的名符其实:)),其技术内涵强调的是 “调用”,基于此,我能想到的是:移动计算,和远程控制,当你的应用不需要在client与server之间传输大量的数据时,RMI是较好的选择,它简 洁、易于开发。但是,一旦你的应用需要在client与server之间传输大量的数据,极端的,比如FTP应用,则RMI是不适合的,我们应该使用 socket。
相关推荐
通过它们可以实现下面协议的测试:WAP、GTP、RMI等等,可通过抓包录制,然后修改里面可变部分为参数,要求熟悉这些协议。 kylinPET性能测试工具下载链接可到kylinPET的官方网站:www.kylinpet.com下载。 kylinPET...
这种方式不再做过多描述,具体请参阅我的《Webservice 之 CXF 实现》、《Webservice 架构设计》博文。这这种方式在互联网上用得多一些。 4. 远程 RMI(如 OMG CORBA)方式 远程 RMI 方式是项目之间进行数据交互的...
RMI使用Java对象序列化作为传输格式,通过Socket进行通信。客户端通过stub将调用请求序列化,发送到服务器端的skelton,后者反序列化请求,执行实际业务逻辑,然后将结果序列化回传给客户端。 XML-RPC与RMI类似,但...
Java 提供了多种网络互联方式,例如 Socket 编程、RMI(Remote Method Invocation)、WebService 等。 三、后端开发 后端开发是指服务器端的开发,负责处理客户端的请求和响应。Java 是一种流行的后端开发语言,...
中间服务器的实现方式有多种,包括HTTP/Socket/SOAP/RMI等网络协议的持久化框架、网页提取与解析以及WebService。持久化框架如Hibernate和MyBatis能快速处理SQL查询,但可能在海量数据处理时性能受限。网页提取与...
JAVA 通信方面相关知识包括 Socket 编程、RMI、WebService 等。Socket 编程是指使用 Socket 对象来实现网络通信。RMI(Remote Method Invocation,远程方法调用)是一种 JAVA 技术,提供了远程方法调用功能。...
例如,通过HTTP/Socket/SOAP/RMI等协议的持久化框架,快速获取和处理数据;使用网页提取与解析技术,无需改造原有Web应用,直接将其转化为适应移动客户端的形式;或者利用WebService,提供跨平台的数据和服务共享,...
4. Java RPC机制:Dubbo作为一个RPC框架,其底层实现涉及到Java的远程过程调用机制,包括但不限于RMI、Hessian、Thrift、WebService等。这些技术都涉及到网络通信和对象序列化等原理。 5. Java其他内容:文章指出,...
目前,移动应用系统的中间件服务器主要采用HTTP/Socket/SOAP/RMI等协议的持久化框架,网页提取与解析,以及WebService等技术,以适应不同的应用场景和需求。 综上所述,构建移动应用系统安全管理平台的关键在于平衡...
4. **Java RMI(远程方法调用)**:RMI允许Java对象在不同的JVM之间进行远程调用,实现分布式计算。 5. **CORBA**:CORBA(Common Object Request Broker Architecture)是跨平台的分布式对象模型,Java通过CORBA...
- **跨语言支持:** 当需要与非Java环境进行交互时,RMI可能不是最佳选择,此时可以考虑使用WebService等技术。 - **安全性:** RMI默认是不安全的,所以在生产环境中使用时需要注意配置相应的安全策略。 #### 三、...
Java通讯方面的知识包括Socket、RMI、WebService等技术,用于实现大项目之间的通讯。 7、8. 谈谈架构师的职责有哪些?软件设计领域,有哪些设计模式? 架构师的职责包括软件设计、系统架构、项目管理等。软件设计...
Java网络编程涉及Socket/TCP/UDP通信,非阻塞I/O(NIO),远程方法调用(RMI)以及CORBA技术,这些都是构建分布式系统的基础。此外,Java的高级特性,如反射、泛型、注解、自动装箱/拆箱、枚举类、可变参数、可变返回...
网络编程方面,Java支持Socket/TCP/UDP通信,NIO(非阻塞I/O),RMI(远程方法调用)和CORBA(公共对象请求代理架构)等技术,用于实现不同层次的网络应用。 Java的高级特性如反射、泛型、注解等,为开发者提供了...
网络编程涵盖了Applet、Socket/TCP/UDP、NIO、RMI和CORBA,这些技术用于网络通信和分布式应用。 JavaEE初级软件工程师阶段,主要学习JSF(JavaServer Faces)框架,包括配置文件、组件库、核心库以及与HTML、CSS、...
- **网络编程**:Applet用于Web浏览器中的小程序,Socket编程实现TCP/IP通信,NIO提供非阻塞I/O,RMI和CORBA支持远程方法调用和分布式计算。 2. **JavaEE初级软件工程师**: - **JSF框架**:用于构建Web应用程序...
- **RMI**:远程方法调用(Remote Method Invocation),实现跨进程服务通信。 #### Java WEB 技术 - **HTML、XML、JavaScript、AJAX**:了解 Web 前端技术的基础知识。 - **jQuery、ExtJS、Flex**:探讨流行的 ...