zoukankan      html  css  js  c++  java
  • java XML-RPC

    1.XML-RPC简介

      xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。

      按照“数据即程序”的观点来看,RPC无非是借助一些通信手段来互相传递数据(信息),所以她也是“高”层次的通信手段,无非是这种通信手段看起来更像是“过程的调用”,因为她往往以一个“函数”的面目示人,从而掩盖了她交换信息的实质。

      工作原理描述;

    1. rpcclient的工作原理:rpcclient根据URL找到rpcserver -> 构造命令包,调用rpcserver上的某个服务的某个方法 -> 接收到rpcserver的返回,解析响应包,拿出调用的返回结果。
    2. rpcserver的工作原理:启动一个webserver(在使用内置的webserver的情况下) -> 注册每个能提供的服务,每个服务对应一个Handler类 ->进入服务监听状态。

    2.基于RPC的java简单应用

     我们在提供远程接口时可以使用webservice的方式,使用xmlrpc同样也可以实现,并且开发简单。实现的方式有许多种,以下采用httpservlet的方式实现

    需要使用到的jar包:xercesImpl.jar    xmlrpc-2.0.1.jar    commons-codec_1.3.jar

      1、业务处理接口

    package com.flyoung.xmlrpc;
    
    public interface ServicesHandler {
        public String execute(String str);
    }

     2、业务接口实现

    package com.flyoung.xmlrpc;
    
    public interface ServicesHandler {
        public String execute(String str);
    }

    3、客户端

    package com.flyoung.xmlrpc;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Vector;
    
    import org.apache.xmlrpc.XmlRpcException;
    import org.apache.xmlrpc.client.XmlRpcClient;
    import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
    
    public class TestClient {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            try {
                //配置客户端
                XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
                //设置服务器端地址
                config.setServerURL(new URL("http://localhost:8080/Rpc/HelloHandler"));
                //创建XmlRpc客户端
                XmlRpcClient client = new XmlRpcClient();
                //绑定以上设置
                client.setConfig(config);
                //创建参数列表
                Vector<String> params = new Vector<String>();
                params.addElement("flyoung");
                //执行XML-RPC 请求
                String result =(String) client.execute("HelloHandler.execute", params);
                System.out.println("result:"+result);
               } catch (MalformedURLException e) {
                e.printStackTrace();
                } catch (XmlRpcException e) {
                e.printStackTrace();
            }
        }
    
    }

      4、服务器端

    package com.flyoung.xmlrpc;
    
    import java.io.IOException;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.xmlrpc.XmlRpcException;
    import org.apache.xmlrpc.server.PropertyHandlerMapping;
    import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
    import org.apache.xmlrpc.webserver.XmlRpcServletServer;
    import com.flyoung.xmlrpc.HelloHandler;
    public class XmlRpcServicesServlet extends HttpServlet {
        private XmlRpcServletServer server;
        @Override
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            try {
                //创建XmlRpcServletServer对象
                server = new XmlRpcServletServer();
                
                //set up handler mapping of XmlRpcServletServer object
                PropertyHandlerMapping pmp = new PropertyHandlerMapping();
                pmp.addHandler("HelloHandler", HelloHandler.class);
                server.setHandlerMapping(pmp);
                
                //more config of XmlRpcServletServer object
                XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig();
                serverConfig.setEnabledForExtensions(true);
                serverConfig.setContentLengthOptional(false);
            } catch (XmlRpcException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            
            server.execute(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            
            server.execute(req, resp);
        }
    
        
        
    }

      5、XML配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>    
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
          <servlet-name>XmlRpcServer</servlet-name>
          <servlet-class>com.flyoung.xmlrpc.XmlRpcServicesServlet</servlet-class>
      </servlet>
      <servlet-mapping>
         <servlet-name>XmlRpcServer</servlet-name>
          <url-pattern>/HelloHandler</url-pattern>
      </servlet-mapping>
    </web-app>

    3.总结

      在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜  索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。

      缺点:

      1)XML-RPC的消息系统过于简单,没有完整意义上的消息模型 
      2)XML-RPC调用服务的方式要求直接指定对象和方法,称不上完整的面向服务的体系 
      3)XML-RPC服务器端提供的服务实际上是特定对象的某个方法,限制了服务器端的开发

     

  • 相关阅读:
    vue-fullcalendar插件
    iframe 父框架调用子框架的函数
    关于调试的一点感想
    hdfs 删除和新增节点
    hadoop yarn 实战错误汇总
    Ganglia 安装 No package 'ck' found
    storm on yarn(CDH5) 部署笔记
    spark on yarn 安装笔记
    storm on yarn安装时 提交到yarn失败 failed
    yarn storm spark
  • 原文地址:https://www.cnblogs.com/yixianyixian/p/3600829.html
Copyright © 2011-2022 走看看