首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

java远道通讯技术及简单实现

2012-10-24 
java远程通讯技术及简单实现此文转自:http://staratsky.iteye.com/blog/345593在分布式服务框架中,一个最

java远程通讯技术及简单实现

此文转自:http://staratsky.iteye.com/blog/345593

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java底层领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、SOAP、EJB和JMS 等,在j2ee中,对java底层远程通讯的技术进行了封装,形成了 Hessian 、 HttpInvoker 、 XFire 、 Axis 等多种形式的远程调用技术。 但对高级程序员而言仍需要掌握Java底层领域中远程通讯的技术,尤其是rmi,xml-rpc,JMS。


1.远程服务基本原理
1)底层协议
  要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。
2)应用级协议
  远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端。
?? 在java领域中知名的远程通信的应用级协议有:RMI、XML-RPC、Binary-RPC、SOAP、JMS
  
2.RMI
2.1RMI原理
??? RMI,即Java RMI(Java Remote Method Invocation),Java远程方法调用.是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。
  RMI是个典型的为java定制的远程通信协议,RMI全部的宗旨就是尽可能简化远程接口对象的使用。
??? RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。
  来看下基于RMI的一次完整的远程通信过程的原理:
  1)客户端发起请求,请求转交至RMI客户端的stub类;
  2)stub类将请求的接口、方法、参数等信息进行序列化;
  3)基于socket将序列化后的流传输至服务器端;
  4)服务器端接收到流后转发至相应的skelton类;
  5)skelton类将请求的信息反序列化后调用实际的处理类;
  6)处理类处理完毕后将结果返回给skelton类;
  7)Skelton类将结果序列化,通过socket将流传送给客户端的stub;
  8)stub在接收到流后反序列化,将反序列化后的Java Object返回给调用者。
2.2JAVA对RMI的支持
??? java.rmi是JAVA提供 RMI 包。RMI是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方.
??? Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。
2.3rmi在java中的应用
??? 要使用RMI,必须构建四个主要的类:远程对象的本地接口、远程对象实现、RMI客户机和RMI服务器。RMI服务器生成远程对象实现的一个实例,并用一个专有的URL注册。RMI客户机在远程RMI服务器上查找服务对象,并将它转换成本地接口类型,然后像对待一个本地对象一样使用

它。
 1)远程对象的本地接口
package test.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloRMI extends Remote {??
??
??? /**?
???? * 简单的返回“Hello World!"字样?
???? * @return 返回“Hello World!"字样?
???? * @throws java.rmi.RemoteException?
???? */?
??? public String helloWorld() throws RemoteException;??
?
??? /**?
???? * @param someBodyName??
???? * @return 返回相应的问候语?
???? * @throws java.rmi.RemoteException?
???? */?
??? public String sayHelloToSomeBody(String someBodyName) throws RemoteException;??
??????
}
2)远程对象实现


    3)RMI服务器


          2)远程调用


              在web.xml中的配置


                      4)远程调用类

                          <servlet> <servlet-name>hassiantest</servlet-name> <servlet-class> test.hassian.SayHelloImpl </servlet-class> </servlet> <servlet-mapping> <servlet-name>hassiantest</servlet-name> <url-pattern>/hassiantest</url-pattern> </servlet-mapping>



                          5.JMS
                            JMS呢,是实现java领域远程通信的一种手段和方法,基于JMS实现远程通信时和RPC是不同的,虽然可以做到RPC的效果,但因为不是从协议级别定义的,因此我们不认为JMS是个RPC协议,但它确实是个远程通信协议,在其他的语言体系中也存在着类似JMS的东西,可以统一的将这类机制称为消息机制,而消息机制呢,通常是高并发、分布式领域推荐的一种通信机制,这里的主要一个问题是容错。
                            来看JMS中的一次远程通信的过程:
                            客户端将请求转化为符合JMS规定的Message;
                            通过JMS API将Message放入JMS Queue或Topic中;
                            如为JMS Queue,则发送中相应的目标Queue中,如为Topic,则发送给订阅了此Topic的JMS Queue。
                            处理端则通过轮训JMS Queue,来获取消息,接收到消息后根据JMS协议来解析Message并处理。
                          详看<实战activeMQ(http://staratsky.iteye.com/blog/275045) >

热点排行