rmi采用什么通信协议(simulink如何rmisetup注册链接)
本文目录
simulink如何rmisetup注册链接
第一步 ,打开autoware msg所在文件夹,然后在matlab 命令行注册一下文件夹,rosgenmsg(’/home/wsh/matlab/github_repo/custom_msgs’)。第二步,然后在matlab 命令行添加路径,addpath(’/home/wsh/matlab/github_repo/custom_msgs/matlab_msg_gen_ros1/glnxa64/install/m’)。第三步,保存路径,savepath。第四步,具体什么用不知道。clear classesSimulink 是 MATLAB 很强大的系统建模、仿真和分析功能组件,上述方法、步骤只介绍了使用Simulink 搭建最基础的输入输出模型。学会使用Simulink 后,我们可以使用Simulink完成更深层次的建模与仿真,有助于我们开发产品。 RMI 全称是 remote method invocation – 远程方法调用,一种用于远程过程调用的应用程序编程接口,是纯 java 的网络分布式应用系统的核心解决方案之一。 RMI 目前使用 Java 远程消息交换协议 JRMP(Java Remote Messageing Protocol)进行通信,由于 JRMP 是专为 Java对象制定的,是分布式应用系统的百分之百纯 java 解决方案,用 Java RMI 开发的应用系统可以部署在任何支持 JRE的平台上,缺点是,由于 JRMP 是专门为 java 对象指定的,因此 RMI 对于非 JAVA 语言开发的应用系统的支持不足,不能与非 JAVA 语言书写的对象进行通信。
什么是 RMI / IIOP 协议求解
客户机可以象调用本地对象的方法一样用相同的语法调用远程对象。RMI API提供的类和方法可以处理所有访问远程方法的基础通信和参数引用要求的串行化。远程方法调用类似于Sun公司1985年提出的远程过程调用(RPC)特征。RPC也要求串行化参数和返回数值数据,但由于没有涉及对象,情况比较简单。 Sun开发了外部数据表示(XDR)系统,支持数据串行化。RPC和RMI之间的一个重要差别是RPC用快速而不够可靠的UDP协议,RMI用低速而可靠的TCP/IP协议。远程方法调用(RMI)和CORBA都是分布式计算技术,在进行分布式时各有其优缺点,为了有助于了解RMI的特点和用途,有必要讨论一下CORBA和RMI的区别。CORBA(Common Object Request Broker Architecture)是OMG的Object Management Architecture(对象管理结构),它是面向对象的分布式系统建立所依据的标准。CORBA被设计成一个能供所有编程语言使用的一个开放性说明,就是说一个机器上的Java客户可以要求另一个用SmallTalk或C++的机器服务。正是由于这种语言的独立性使得CORBA这么灵活和吸引人。为了适应语言独立性,CORBA采用了非常通用的标准作为其接口。在不同的语言中,远程调用、签名和对象的引入有各自不同的定义,所以CORBA必须尽可能的中立和开放。正是这种通用性是CORBA的一个弱点。当开发人员都采用CORBA时,他们要用一种新的标准定义语言接口,它要求开发者学习新的编程接口,从而减小了远程模型的透明性。RMI是为仅在Java对Java的分布式计算中而开发的。远程调用的标准是为了Java和应用Java的自然Java签名和调用而开发的,这使得RMI 对Java的开发者相当透明而且易于实现。RMI用Java语言紧密集成从而同CORBA相比能够提供非常好的容错能力及对异常的处理。尽管Java的 RMI标准不像CORBA那样语言独立,但Java本身是一个独立的平台,这就使RMI在跨平台的分布软件开发中是一个很好的选择。IIOP 它是一个用于CORBA 2.0及兼容平台上的协议。
几种通讯协议的比较
RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础。但它只能用于JAVA程序之间的通讯。Hessian和Burlap是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。Httpinvoker是SpringFramework提供的远程通讯协议,只能用于JAVA程序间的通讯,且服务端和客户端必须使用SpringFramework。Web service是连接异构系统或异构语言的首选协议,它使用SOAP形式通讯,可以用于任何语言,目前的许多开发工具对其的支持也很好。�0�2测试结果显示,几种协议的通讯效率依次为:RMI 》 Httpinvoker 》= Hessian 》》 Burlap 》》 web serviceRMI不愧是JAVA的首选远程调用协议,非常高效稳定,特别是在大数据量的情况下,与其他通讯协议的差距尤为明显。HttpInvoker使用java的序列化技术传输对象,与RMI在本质上是一致的。从效率上看,两者也相差无几,HttpInvoker与RMI的传输时间基本持平。Hessian在传输少量对象时,比RMI还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较RMI要慢20%左右。Burlap仅在传输1条数据时速度尚可,通常情况下,它的毫时是RMI的3倍。Web Service的效率低下是众所周知的,平均来看,Web Service的通讯毫时是RMI的10倍。�0�2�0�2二、结果分析1、直接调用直接调用的所有毫时都接近0,这说明程序处理几乎没有花费时间,记录的全部时间都是远程调用耗费的。2、RMI调用与设想的一样,RMI理所当然是最快的,在几乎所有的情况下,它的毫时都是最少的。特别是在数据结构复杂,数据量大的情况下,与其他协议的差距尤为明显。为了充分发挥RMI的性能,另外做了测试类,不使用Spring,用原始的RMI形式(继承UnicastRemoteObject对象)提供服务并远程调用,与Spring对POJO包装成的RMI进行效率比较。结果显示:两者基本持平,Spring提供的服务还稍快些。初步认为,这是因为Spring的代理和缓存机制比较强大,节省了对象重新获取的时间。3、Hessian调用caucho公司的resin服务器号称是最快的服务器,在java领域有一定的知名度。Hessian做为resin的组成部分,其设计也非常精简高效,实际运行情况也证明了这一点。平均来看,Hessian较RMI要慢20%左右,但这只是在数据量特别大,数据结构很复杂的情况下才能体现出来,中等或少量数据时,Hessian并不比RMI慢。Hessian的好处是精简高效,可以跨语言使用,而且协议规范公开,我们可以针对任意语言开发对其协议的实现。目前已有实现的语言有:java, c++, .net, python, ruby。还没有delphi的实现。另外,Hessian与WEB服务器结合非常好,借助WEB服务器的成熟功能,在处理大量用户并发访问时会有很大优势,在资源分配,线程排队,异常处理等方面都可以由成熟的WEB服务器保证。而RMI本身并不提供多线程的服务器。而且,RMI需要开防火墙端口,Hessian不用。4、Burlap调用Burlap与Hessian都是caucho公司的开源产品,只不过Hessian采用二进制的方式,而Burlap采用xml的格式。测试结果显示,Burlap在数据结构不复杂,数据量中等的情况下,效率还是可以接受的,但如果数据量大,效率会急剧下降。平均计算,Burlap的调用毫时是RMI的3倍。我认为,其效率低有两方面的原因,一个是XML数据描述内容太多,同样的数据结构,其传输量要大很多;另一方面,众所周知,对xml的解析是比较费资源的,特别对于大数据量情况下更是如此。5、HttpInvoker调用HttpInvoker是SpringFramework提供的JAVA远程调用方法,使用java的序列化机制处理对象的传输。从测试结果看,其效率还是可以的,与RMI基本持平。不过,它只能用于JAVA语言之间的通讯,而且,要求客户端和服务端都使用SPRING框架。另外,HttpInvoker 并没有经过实践的检验,目前还没有找到应用该协议的项目。6、web service调用�0�2�0�2�0�2�0�2�0�2�0�2 本次测试选用了apache的AXIS组件作为WEB SERVICE的实现,AXIS在WEB SERVICE领域相对成熟老牌。为了仅测试数据传输和编码、解码的时间,客户端和服务端都使用了缓存,对象只需实例化一次。但是,测试结果显示,web service的效率还是要比其他通讯协议慢10倍。如果考虑到多个引用指向同一对象的传输情况,web service要落后更多。因为RMI,Hessian等协议都可以传递引用,而web service有多少个引用,就要复制多少份对象实体。Web service传输的冗余信息过多是其速度慢的原因之一,监控发现,同样的访问请求,描述相同的数据,web service返回的数据量是hessian协议的6.5倍。另外,WEB SERVICE的处理也很毫时,目前的xml解析器效率普遍不高,处理xml 《-》 bean很毫资源。从测试结果看,异地调用比本地调用要快,也从侧面说明了其毫时主要用在编码和解码xml文件上。这比冗余信息更为严重,冗余信息占用的只是网络带宽,而每次调用的资源耗费直接影响到服务器的负载能力。(MS的工程师曾说过,用WEB SERVICE不能负载100个以上的并发用户。)测试过程中还发现,web service编码不甚方便,对非基本类型需要逐个注册序列化和反序列化类,很麻烦,生成stub更累,不如spring + RMI/hessian处理那么流畅简洁。
哪些端口是通过java RMI连接使用
RMI的优势
这种机制给分布计算的系统设计、编程都带来了极大的方便。只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。 1、面向对象: RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java Hash表这样的复杂类型作为一个参数进行传递。
2、可移动属性: RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
3、设计方式: 对象传递功能使你可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型——就会失去设计方式上所提供的优点。
4、安全性: RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
5、便于编写和使用 RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。远程接口实际上就是Java接口。为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将作为远程对象引用。 一个国外的PPT上还还总结到: Java RMI Advantages: Full object support Cross platform. capabilities Robust communications Large objects Security for client and servers Distribution/updates of codes
RMI的劣势
从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。 一个国外的PPT上也总结到: Java RMI Disadvantages: Java RMI only supports Java Proprietary protocol by single vendor Requires RMI-lookup Requires non-standard port
RMI与Socket的比较
RMI技术比较socket的网络编程主要有以下几个方面: 第一、RMI是面向对象的,而后者不是。 第二、RMI是与语言相绑定的。比如当你使用Java RMI技术的时候,客户端与服务器端都必须使用Java开发。而socket的网络编程是使用独立于开发语言的,甚至独立于平台。基于socket的网络编程,客户端与服务器端可以使用不同开发语言和不同的平台。 第三、从网络协议栈的观点来看,RMI与socket的网络编程处于不同层次上。基于socket的网络编程位于TCP协议之上,而RMI在TCP协议之上,又定义了自己的应用协议,其传输层采用的是Java远程方法协议(JRMP)。可见,在网络协议栈上,基于RMI的应用位置更高一些,这也决定了,与socket的网络编程相比,RMI会丧失一些灵活性和可控性,但是好处是它带给了应用开发者更多的简洁,方便和易用。比如:如果你用的是RMI,你不需要关心消息是怎么序列化的,你只需要像本地方法调用一样,使用RMI。代价是:应用开发者无法很好地控制消息的序列化机制。 第四、这是最后一点不同,我认为也是比较重要的一点,就是两种方法的性能比较,其往往决定着你将使用那种技术来开发你的应用。 实验的结果是:RMI与TCP based socket相比,传输相同的有效数据,RMI需要占用更多的网络带宽(protocol overhead)。从这里,我们可以得出一个一般性的结论:RMI主要是用于远程方法的”调用“(RMI是多么的名符其实:)),其技术内涵强调的是 “调用”,基于此,我能想到的是:移动计算,和远程控制,当你的应用不需要在client与server之间传输大量的数据时,RMI是较好的选择,它简洁、易于开发。但是,一旦你的应用需要在client与server之间传输大量的数据,极端的,比如FTP应用,则RMI是不适合的,我们应该使用 socket。
PS: RMI的效率还是很高的,一般情况下会比Hessian更高效,比Web Service更是高效很多;当然和socket这种东东相比,当然要低效一点了,socket更底层一些啊。RMI的具体实现,依然是依赖于底层的Socket编程。
一个简单的RMI系统,一般可以分成4个文件,下面来介绍各个文件的创建和作用
第一步:创建一个远程对象接口
import java.rmi.Remote; import java.rmi.RemoteException; /* * 这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象 * 我们可供远程调用的方法就是通过这里开公开 */ public interface IRMI extends Remote{public String invoke() throws RemoteException; } 12345678910
第二步:创建接口的具体实现类
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /* * 远程对象的实现 * 公开方法的具体实现就是这里定义的 */ public class IRMIImpl extends UnicastRemoteObject implements IRMI { protected IRMIImpl() throws RemoteException {super(); // 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常} private static final long serialVersionUID = 6131922116577454476L; public String invoke() throws RemoteException { //该方法公开return "hello,world!";} public String tryInvoke() throws RemoteException{ //该方法未公开,若要公开请在接口中定义return "try to remote me";} } 1234567891011121314151617181920212223
第三步:创建RMI服务器
import java.rmi.Naming; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; /* * 远程对象的注册类 该类应该在服务器端执行,执行之后 * 该机器将变为RMI服务器 客户端可以通过正确的url来访问 * 服务器上的远程对象,执行对外报露的方法 */ public class RMIServer {static int port = 8888; /** 创建一个Registry对象.* LocateRegistry用于获取名字服务或创建名字服务.* 调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry* @return 返回一个Registry对象*/private static Registry createRegistry() {Registry registry = null;try {registry = LocateRegistry.getRegistry(port); //如果该端口未被注册,则抛异常registry.list(); //拿到该端口注册的rmi对象} catch (final Exception e) {try {registry = LocateRegistry.createRegistry(port);//捕获异常,端口注册} catch (final Exception ee) {ee.printStackTrace();}}return registry;} /*** 将对象注册到rmi服务器上*/public static void bind() {Registry registry = createRegistry();try {IRMIImpl impl = new IRMIImpl();registry.rebind("mytask", impl); //这就是绑定,client里lookup必须和"mytast"一样才能远程调用impl} catch (Exception e) {e.printStackTrace();}} public static void main(String args) {try {bind();} catch (Exception e) {e.printStackTrace();}} } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
上面是一种比较好的写法,如果只是要测试,可以直接在main()方法中写:
ImplementClass ic = new ImplementClass(); //具体实现类Registry r = LocateRegistry.createRegistry(8888);r.bind("mytask", ic);//Naming.rebind("rmi://localhost:8888/mytask", ic); 可替换上句 1234
1.注册一个端口 2.在注册端口绑定taskName和implementClass 3.客户端就可以通过url和taskName来找到implementClass。
第四步:创建RMI客户端
import java.rmi.Naming; public class RMIClient {/*** 调用远程对象中的方法* @throws Exception*/public static void getRemoteObject() throws Exception{ /*得到远程发布的服务返回与指定 name 关联的远程对象的引用(一个stub)*/IRMI obj = (IRMI)Naming.lookup("rmi://localhost:"+RMIServer.port+"/mytask"); //注:通过接口拿 System.out.println(obj.invoke()); //调用远程服务的方法} public static void main(String args) {try {getRemoteObject();} catch (Exception e) {e.printStackTrace();}} } 123456789101112131415161718192021222324
运行RMI系统:启动RMI服务器,启动客户端即可。
rmi是什么
RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。 网上有很多实例,可以自己去了解一下。还是很重要的。
更多文章:
sqlserver insert(.net sqlserver 的insert语句怎么样使用参数)
2024年9月3日 20:45
proposal动词(proposal和propose分别是什么意思)
2024年7月24日 12:29
mysql存储过程修改表结构(mysql 怎么改变表格中的数据)
2024年7月12日 12:21
mysql详细介绍(MySQL 关于表复制 insert into 语法的详细介绍)
2024年7月26日 16:10
newff函数的函数参数?matlab中建立bp神经网络的函数newff的第二个参数的问题
2024年6月27日 23:37
构造函数怎么写(求助!!! c++ 数组子类的构造函数应该怎么写)
2024年7月23日 09:54
plsqldeveloper使用教程(怎么使用plsql developer)
2024年5月15日 10:55
linux怎么彻底删除文件(linux怎么将一个目录下除了某个文件外的文件都删除)
2024年7月22日 23:50
微信公众号开发的时候如何选择公众号的类型?微信公众平台开发需要哪些工具
2023年6月12日 07:20