zoukankan      html  css  js  c++  java
  • XML-RPC-1概述

    XML-RPC是一个远程过程调用远端程序呼叫)(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制。
     
    中文名
    XML-RPC
    外文名
    XML Remote Procedure Call
    属    于
    标准通用标记语言
    类    型
    一个子集

    关于XML-RPC

    基本介绍

    XML-RPC是工作在Internet上的远程过程调用协议。一个XML-RPC消息就是一个请求体为xml的http-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。

    Request example

    Here's an example of an XML-RPC request:
    POST /RPC2 HTTP/1.0User-Agent: Frontier/5.1.2 (WinNT)Host: betty.userland.comContent-Type: text/xmlContent-length: 181
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xmlversion="1.0"?>
    <methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
    <param>
    <value>
    <i4>41</i4>
    </value>
    </param>
    </params>
    </methodCall>

    Response example

    Here's an example of a response to an XML-RPC request:
    HTTP/1.1 200 OKConnection: closeContent-Length: 158Content-Type: text/xmlDate: Fri, 17 Jul 1998 19:55:08 GMTServer: UserLand Frontier/5.1.2-WinNT
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xmlversion="1.0"?>
    <methodResponse>
    <params>
    <param>
    <value>
    <string>
    SouthDakota
    </string>
    </value>
    </param>
    </params>
    </methodResponse>

    XML-RPC入门程序

    基本做法

    以下的入门程序包括一个管理器(HelloHandler)、一个服务器(HelloServer)、一个客户程序(HelloClient)。
    首先要做的是创建用于远程过程调用的类和方法,人们常常称之为管理器。Xml-rpc管理器是一个方法和方法集,它接受xml-rpc请求,并对请求的内容进行解码,再向一个类和方法发出请求。
     

    管理器类

     
    1
    2
    3
    4
    5
    6
    7
    packagexmlRpc;
    /***@authortrier**<b><code>HelloHandler</code></b>isasimplehandlerthancan*beregisteredwithanXML-RPCserver*/
    publicclassHelloHandler{
    publicStringsayHello(Stringname){
    return"Hello"+name;
    }
    }
    服务器程序将创建的管理器注册到服务器上,并为服务器指明应用程序其他特定的参数。
     

    服务器类

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    packagexmlRpc;
    /**
    *
    *<b><code>HelloServer</code></b>isasimpleXML-RPCserver
    *thatwilltakethe<code>HelloHandler</code>classavailable
    *forXML-PRCcalls.
    *<o:p
    */
    importorg.apache.xmlrpc.WebServer;
    importorg.apache.xmlrpc.XmlRpc;
    importjava.IOException;
    publicclassHelloServer{
    publicstaticvoidmain(String[]args){
    if(args.length<1){
    System.out.println("Usage:javaHelloServer[port]");
    System.exit(-1);
    }
    try{
    XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
    //starttheserver
    System.out.println("StartingXML-RPCServer......");
    WebServerserver=newWebServer(Integer.parseInt(args[0]));
    //registerourhandlerclass
    server.addHandler("hello",newHelloHandler());
    System.out.println("Nowacceptingrequests......");
    }catch(ClassNotFoundExceptione){
    System.out.println("CouldnotlocateSAXDriver");
    }catch(IOExceptione){
    System.out.println("Couldnotstartserver:"+e.getMessage());
    }
    }
    }
     

    客户程序

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    packagexmlRpc;
    /**
    *
    *<b><code>HelloClient</code></b>isasimpleXML-RPCclient
    *thatmakesanXML-RPCrequestto<code>HelloServer</code>
    */
    importjava.i.IOException;
    importjava.util.Vector;
    importorg.apache.xmlrpc.XmlRpc;
    importorg.apache.xmlrpc.XmlRpcClient;
    importjava.t.MalformedURLException;
    importorg.apache.xmlrpc.XmlRpcException;
    publicclassHelloClient{
    publicstaticvoidmain(String[]args){
    if(args.length<1){
    System.out.println("Usage:javaHelloClient[yourname]");
    System.exit(-1);
    }
    try{
    //UsetheApacheXerecesSAXDriver
    XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
    //Specifytheserver
    XmlRpcClientclient=newXmlRpcClient("http://localhost:8585");
    //createrequest
    Vectorparams=newVector();
    params.addElement(args[0]);
    //makearequestandprinttheresult
    Stringresult=(String)client.execute("hello.sayHello",params);
    System.out.println("Responsefromserver:"+result);
    }catch(ClassNotFoundExceptione){
    System.out.println("CouldnotlocateSAXDriver");
    }catch(MalformedURLExceptione){
    System.out.println("IncorrectURLfroxml-rpcserverforamt:"+e.getMessage());
    }catch(XmlRpcExceptione){
    System.out.println("XmlRpcException:"+e.getMessage());
    }catch(IOExceptione){
    System.out.println("IOException:"+e.getMessage());
    }
    }
    }
     

    RPC和RMI的简单比较

    调用形式

    在RMI和RPC之间最主要的区别在于方法是如何被调用的。在RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。
     

    classname.methodname的形式

    在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。
     

    methodname

    这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。
     

    匹配成功后

    一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。 
    IT黑马
  • 相关阅读:
    ASP.NET程序中常用的三十三种代码
    uri
    用XML保存和读取图片
    location
    访问相关节点
    onkeyup,onkeydown,onkeypress
    Asp.net中Server.Transfer,Server.Execute和Response.Redirect的区别
    关于window.showModalDialog()返回值的学习心得
    WP7数据绑定
    hdu 1568
  • 原文地址:https://www.cnblogs.com/hmit/p/11399696.html
Copyright © 2011-2022 走看看