webservice和rmi都可以实现远程过程调用,但是我的猜想是1.webservice和rmi是将远程对象传输到客户端,即客户端获得远程对象实例,然后调用方法?2.webservice和rmi通过通信实现调用,比如客户端将需要调用的方法名和参数发送给服务器端,服务器端调用相关的方法后将结果以一定格式传送给客户端,客户端解析出来。
如果是上面的方法一,那么如果客户端调用了一个方法,虽然获得了远程对象实例,但是客户端机器并不具备运行环境,如方法需要调用运行在服务器上的某个其他对象,或者使用服务器上的一个数据库等等,那么在客户端并没有这个环境啊?
如果是方法二,那么我看书上的一个例子,使用spring实现rmi,客户端这样访问
ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:spring.xml");
UserDao ud=(UserDao)ctx.getBean("ud");
ud.sayHello();
其中发布rmi服务器的配置为
<bean class="org.springframework.remoting.rmi.RmiServiceExporter"
p:service-ref="userDao"
p:serviceName="UserDao"
p:serviceInterface="rmi.UserDao"
p:registryPort="11199"/>
这里又说明了客户端确实获得了对象实例。
求解
------解决思路----------------------
Web Service提供的服务是基于web容器的,底层使用http协议,类似一个远程的服务提供者,比如天气预报服务,对各地客户端提供天气预报,是一种请求应答的机制,是跨系统跨平台的。就是通过一个servlet,提供服务出去。
首先客户端从服务器的到WebService的WSDL,同时在客户端声称一个代理类(Proxy Class) 这个代理类负责与WebService服务器进行Request 和Response 当一个数据(XML格式的)被封装成SOAP格式的数据流发送到服务器端的时候,就会生成一个进程对象并且把接收到这个Request的SOAP包进行解析,然后对事物进行处理,处理结束以后再对这个计算结果进行SOAP包装,然后把这个包作为一个Response发送给客户端的代理类(Proxy Class),同样地,这个代理类也对这个SOAP包进行解析处理,继而进行后续操作。这就是WebService的一个运行过程。
Web Service大体上分为5个层次:
1. Http传输信道
2. XML的数据格式
3. SOAP封装格式
4. WSDL的描述方式
5. UDDI UDDI是一种目录服务,企业可以使用它对Webservices进行注册和搜索
RMI 采用stubs 和 skeletons 来进行远程对象(remote object)的通讯。stub 充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是本地工作,采用tcp/ip协议,客户端直接调用服务端上的一些方法。优点是强类型,编译期可检查错误,缺点是只能基于JAVA语言,客户机与服务器紧耦合;
JRMP是Java持有的,基于流的协议,完成一个对象的Java到Java的远程调用;IIOP是CORBA对象请求代理之间交流的协议,Java中使得程序可以和其他语言的CORBA实现互操作性的协议,和JRMP互补。
优点:支持分布式对象、跨平台,stubs/skeletons机制;缺点:不能跨语言。