您的位置: 首页 > 技术文档 > 网络编程 > Java远程通讯可选技术及原理
Ajax 的六个误区 回到列表 不用组件实现Ajax效果
 Java远程通讯可选技术及原理

作者:villa123 时间: 2008-03-10 文档类型:合作网站提供 来自:CSDN

第 1 页 Java远程通讯可选技术及原理 [1]
第 2 页 Java远程通讯可选技术及原理 [2]
第 3 页 Java远程通讯可选技术及原理 [3]

可选实现技术

当然,在上面的原理中并没有介绍到所有的java领域可选的远程通信协议了,例如还有EJB采用的ORMI、Spring自己定义的一个简单的Http Invoker等等。
看完原理后我们再来看看目前java领域可用于实现远程通讯的框架或library,知名的有:JBoss-Remoting、Spring-Remoting、Hessian、Burlap、XFire(Axis)、ActiveMQ、Mina、Mule、EJB3等等,来对每种做个简单的介绍和评价,其实呢,要做分布式服务框架,这些东西都是要有非常深刻的了解的,因为分布式服务框架其实是包含了解决分布式领域以及应用层面领域两方面问题的。
当然,你也可以自己根据远程网络通信原理(transport protocol+Net IO)去实现自己的通讯框架或library。

那么在了解这些远程通讯的框架或library时,会带着什么问题去学习呢?

  1. 是基于什么协议实现的?
  2. 怎么发起请求?
  3. 怎么将请求转化为符合协议的格式的?
  4. 使用什么传输协议传输?
  5. 响应端基于什么机制来接收请求?
  6. 怎么将流还原为传输格式的?
  7. 处理完毕后怎么回应?

JBoss-Remoting

Jboss-remoting是由jboss编写的一个java领域的远程通讯框架,基于此框架,可以很简单的实现基于多种传输协议的java对象的RPC。

直接来回答问题:

  1. 是基于什么协议实现的?
    JBoss-Remoting是个通讯框架,因此它支持多种协议方式的通信,例如纯粹的socket+io方式、rmi方式、http+io方式等。
  2. 怎么发起请求?
    在JBoss-Remoting中,只需将需要发起的请求参数对象传入jboss-remoting的InvocationRequest对象即可,也可根据协议基于InvocationRequest封装符合需求的InvocationRequest对象。
  3. 怎么将请求转化为符合协议的格式的?
    JBoss-Remoting基于Java串行化机制或JBoss自己的串行化实现来将请求转化为对象字节流。
  4. 使用什么传输协议传输?
    支持多种传输协议,例如socket、http等。
  5. 响应端基于什么机制来接收请求?
    响应端只需将自己的处理对象注册到JBoss-Remoting提供的server端的Connector对象中即可。
  6. 怎么将流还原为传输格式的?
    JBoss-Remoting基于java串行化机制或jboss自己的串行化实现来将请求信息还原为java对象。
  7. 处理完毕后怎么回应?
    处理完毕后将结果对象直接返回即可,jboss-remoting会将此对象按照协议进行序列化,返回至调用端。

另外,jboss-remoting支持多种通信方式,例如同步/异步/单向通信等。

Spring-Remoting

Spring-remoting是Spring提供java领域的远程通讯框架,基于此框架,同样也可以很简单的将普通的spring bean以某种远程协议的方式来发布,同样也可以配置spring bean为远程调用的bean。

  1. 是基于什么协议实现的?
    和JBoss-Remoting一样,作为一个远程通讯的框架,Spring通过集成多种远程通讯的library,从而实现了对多种协议的支持,例如rmi、http+io、xml-rpc、binary-rpc等。
  2. 怎么发起请求?
    在Spring中,由于其对于远程调用的bean采用的是proxy实现,发起请求完全是通过服务接口调用的方式。
  3. 怎么将请求转化为符合协议的格式的?
    Spring按照协议方式将请求的对象信息转化为流,例如Spring Http Invoker是基于Spring自己定义的一个协议来实现的,传输协议上采用的为http,请求信息是基于java串行化机制转化为流进行传输。
  4. 使用什么传输协议传输?
    支持多种传输协议,例如rmi、http等等。
  5. 响应端基于什么机制来接收请求?
    响应端遵循协议方式来接收请求,对于使用者而言,则只需通过spring的配置方式将普通的spring bean配置为响应端或者说提供服务端。
  6. 怎么将流还原为传输格式的?
    按照协议方式来进行还原。
  7. 处理完毕后怎么回应?
    处理完毕后直接返回即可,spring-remoting将根据协议方式来做相应的序列化。

Hessian

Hessian是由caucho提供的一个基于binary-RPC实现的远程通讯library。

  1. 是基于什么协议实现的?
    基于Binary-RPC协议实现。
  2. 怎么发起请求?
    需通过Hessian本身提供的API来发起请求。
  3. 怎么将请求转化为符合协议的格式的?
    Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
  4. 使用什么传输协议传输?
    Hessian基于Http协议进行传输。
  5. 响应端基于什么机制来接收请求?
    响应端根据Hessian提供的API来接收请求。
  6. 怎么将流还原为传输格式的?
    Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
  7. 处理完毕后怎么回应?
    处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。

Burlap

Burlap也是有caucho提供,它和hessian的不同在于,它是基于XML-RPC协议的。

  1. 是基于什么协议实现的?
    基于XML-RPC协议实现。
  2. 怎么发起请求?
    根据Burlap提供的API。
  3. 怎么将请求转化为符合协议的格式的?
    将请求信息转化为符合协议的XML格式,转化为流进行传输。
  4. 使用什么传输协议传输?
    Http协议。
  5. 响应端基于什么机制来接收请求?
    监听Http请求。
  6. 怎么将流还原为传输格式的?
    根据XML-RPC协议进行还原。
  7. 处理完毕后怎么回应?
    返回结果写入XML中,由Burlap返回至调用端。

XFire、Axis

XFire、Axis是Webservice的实现框架,WebService可算是一个完整的SOA架构实现标准了,因此采用XFire、Axis这些也就意味着是采用webservice方式了。

  1. 是基于什么协议实现的?
    基于SOAP协议。
  2. 怎么发起请求?
    获取到远端service的proxy后直接调用。
  3. 怎么将请求转化为符合协议的格式的?
    将请求信息转化为遵循SOAP协议的XML格式,由框架转化为流进行传输。
  4. 使用什么传输协议传输?
    Http协议。
  5. 响应端基于什么机制来接收请求?
    监听Http请求。
  6. 怎么将流还原为传输格式的?
    根据SOAP协议进行还原。
  7. 处理完毕后怎么回应?
    返回结果写入XML中,由框架返回至调用端。

ActiveMQ

ActiveMQ是JMS的实现,基于JMS这类消息机制实现远程通讯是一种不错的选择,毕竟消息机制本身的功能使得基于它可以很容易的去实现同步/异步/单向调用等,而且消息机制从容错角度上来说也是个不错的选择,这是Erlang能够做到容错的重要基础。

  1. 是基于什么协议实现的?
    基于JMS协议。
  2. 怎么发起请求?
    遵循JMS API发起请求。
  3. 怎么将请求转化为符合协议的格式的?
    不太清楚,猜想应该是二进制流。
  4. 使用什么传输协议传输?
    支持多种传输协议,例如socket、http等等。
  5. 响应端基于什么机制来接收请求?
    监听符合协议的端口。
  6. 怎么将流还原为传输格式的?
    同问题3。
  7. 处理完毕后怎么回应?
    遵循JMS API生成消息,并写入JMS Queue中。

基于JMS此类机制实现远程通讯的例子有Spring-Intergration、Mule、Lingo等等。

Mina

Mina是Apache提供的通讯框架,在之前一直没有提到网络IO这块,之前提及的框架或library基本都是基于BIO的,而Mina是采用NIO的,NIO在并发量增长时对比BIO而言会有明显的性能提升,而java性能的提升,与其NIO这块与OS的紧密结合是有不小的关系的。

  1. 是基于什么协议实现的?
    基于纯粹的Socket+NIO。
  2. 怎么发起请求?
    通过Mina提供的Client API。
  3. 怎么将请求转化为符合协议的格式的?
    Mina遵循java串行化机制对请求对象进行序列化。
  4. 使用什么传输协议传输?
    支持多种传输协议,例如socket、http等等。
  5. 响应端基于什么机制来接收请求?
    以NIO的方式监听协议端口。
  6. 怎么将流还原为传输格式的?
    遵循java串行化机制对请求对象进行反序列化。
  7. 处理完毕后怎么回应?
    遵循Mina API进行返回。

MINA是NIO方式的,因此支持异步调用是毫无悬念的。

EJB

EJB最突出的在于其分布式,EJB采用的是ORMI协议,和RMI协议是差不多的,但EJB在分布式通讯的安全控制、transport pool、smart proxy等方面的突出使得其在分布式领域是不可忽视的力量。

  1. 是基于什么协议实现的?
    基于ORMI协议。
  2. 怎么发起请求?
    EJB调用。
  3. 怎么将请求转化为符合协议的格式的?
    遵循java串行化机制对请求对象进行序列化。
  4. 使用什么传输协议传输?
    Socket。
  5. 响应端基于什么机制来接收请求?
    监听协议端口。
  6. 怎么将流还原为传输格式的?
    遵循java串行化机制对请求对象进行反序列化。
  7. 处理完毕后怎么回应?
    直接返回处理对象即可。

在之前的分布式服务框架系列的文章中对于jndi有误导的嫌疑,在这篇blog中也顺带的提下jndi的机制,由于JNDI取决于具体的实现,在这里只能是讲解下jboss的jndi的实现了。

在将对象实例绑定到jboss jnp server后,当远程端采用context.lookup()方式获取远程对象实例并开始调用时,jboss jndi的实现方法是从jnp server上获取对象实例,将其序列化回本地,然后在本地进行反序列化,之后在本地进行类调用。
通过这个机制,就可以知道了,本地其实是必须有绑定到jboss上的对象实例的class的,否则反序列化的时候肯定就失败了,而远程通讯需要做到的是在远程执行某动作,并获取到相应的结果,可见纯粹基于JNDI是无法实现远程通讯的。
但JNDI也是实现分布式服务框架一个很关键的技术点,因为可以通过它来实现透明化的远端和本地调用,就像ejb,另外它也是个很好的隐藏实际部署机制(就像datasource)等的方案。

总结

由上一系列的分析可知,在远程通讯领域中,涉及的知识点还是相当的多的,例如有:通信协议(Socket/tcp/http/udp/rmi/xml-rpc etc.)、消息机制、网络IO(BIO/NIO/AIO)、MultiThread、本地调用与远程调用的透明化方案(涉及java classloader、Dynamic Proxy、Unit Test etc.)、异步与同步调用、网络通信处理机制(自动重连、广播、异常、池处理等等)、Java Serialization (各种协议的私有序列化机制等)、各种框架的实现原理(传输格式、如何将传输格式转化为流的、如何将请求信息转化为传输格式的、如何接收流的、如何将流还原为传输格式的等等),要精通其中的哪些东西,得根据实际需求来决定了,只有在了解了原理的情况下才能很容易的做出选择,甚至可以根据需求做私有的远程通讯协议,对于从事分布式服务平台或开发较大型的分布式应用的人而言,我觉得至少上面提及的知识点是需要比较了解的。

参考文档(感谢这些文章)
RMI原理及实现http://www.yesky.com/274/1625274.shtml
Java NIO原理和使用
http://www.jdon.com/concurrent/nio%D4%AD%C0%ED%D3%A6%D3%C3.htm
XML RPC协议http://hedong.3322.org/archives/000470.html
http://www.mengyan.org/blog/archives/2005/07/12/30.html
Spring技术应用中的远程服务详解http://www.builder.com.cn/2007/1027/583384.shtml
JAVA RPC通信机制之SOAPhttp://www.java114.com/content16/content3826.html
Java Remoting:Protocol BenchMarkshttp://q.sohu.com/forum/5/topic/1148909
Evalution of RMI Alternativehttps://www.jfire.org/modules/phpwiki/index.php/Evaluation%20of%20RMI%20Alternative
Metaprotocol Taxonomyhttp://hessian.caucho.com/doc/metaprotocol-taxonomy.xtp
什么是Webservicehttp://www.vchome.net/dotnet/webservice/webservice15.htm

本文链接:http://www.blueidea.com/tech/program/2008/5438.asp 

出处:CSDN
责任编辑:bluehearts

上一页 Java远程通讯可选技术及原理 [2] 下一页

◎进入论坛网络编程版块参加讨论

相关文章 更多相关链接
基于flash的360虚拟现实引擎实现
FLASH与ASP通信原理入门
你的编程语言可以这样做吗?
flash电子书鼠标拖拽翻页效果原理
Fireworks通道原理及快捷运用
关键字搜索 常规搜索 推荐文档
热门搜索:CSS Fireworks 设计比赛 网页制作 web标准 用户体验 UE photoshop Dreamweaver Studio8 Flash 手绘 CG
站点最新 站点最新列表
周大福“敬•自然”设计大赛开启
国际体验设计大会7月将在京举行
中国国防科技信息中心标志征集
云计算如何让安全问题可控
云计算是多数企业唯一拥抱互联网的机会
阿里行云
云手机年终巨献,送礼标配299起
阿里巴巴CTO王坚的"云和互联网观"
1499元买真八核 云OS双蛋大促
首届COCO桌面手机主题设计大赛
栏目最新 栏目最新列表
浅谈JavaScript编程语言的编码规范
如何在illustrator中绘制台历
Ps简单绘制一个可爱的铅笔图标
数据同步算法研究
用ps作简单的作品展示页面
CSS定位机制之一:普通流
25个最佳最闪亮的Eclipse开发项目
Illustrator中制作针线缝制文字效果
Photoshop制作印刷凹凸字体
VS2010中创建自定义SQL Rule
>> 分页 首页 前页 后页 尾页 页次:3/31个记录/页 转到 页 共3个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
网站可用性测试及优化指南
《写给大家看的色彩书1》
《跟我去香港》
众妙之门—网站UI 设计之道
《Flex 4.0 RIA开发宝典》
《赢在设计》
犀利开发—jQuery内核详解与实践
作品集 更多内容

杂⑦杂⑧ Gold NORMANA V2