返回信息流有时候只是有些懒,想做一个服务器和一个客户端,然后让它们之间通信,交换一些简单信息。比如搭一个服务器,客户端发送两个整数,服务器算出它们的和,返回客户端。
但是就是懒得直接用Socket,懒得做文字处理,处理TCP的数据流,还得搞语法分析等一堆麻烦事。虽然我刚学过编译原理,对Lex和Yacc还是很熟悉的,但是就为了一个小程序大费周折值得吗?。
于是我找一些高层的协议:有没有能让网络通信就像调用一个本地的函数一样简单?比如:
服务器端设置一个函数:
int calculate_a_plus_b(int a, int b) {
return a+b;
}
在客户端调用:
result=server.calculate_a_plus_b(5,8)
然后result就等于13了。
这个东西有,它叫做XML-RPC。
它的工作原理是将一个函数调用,包括函数名,所有参数名和参数内容,转换成XML文本流,通过HTTP协议发送到服务器;服务器将返回值也转换成XML的形式,发回客户端。
举一个例子(这不是算两个数的和):
Here's an example of an XML-RPC request:
POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
函数名叫做“examples.getStateName”,有一个32位整型参数41。这个文本流传给服务器之后,服务器也用XML返回:
Here's an example of a response to an XML-RPC request:
HTTP/1.1 200 OK
Connection: close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:08 GMT
Server: UserLand Frontier/5.1.2-WinNT
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
返回一个字符串,“South Dakota”。
当然,用网络传递的话,和系统和语言都没有关系了。你可以在Linux上向一个Windows服务器发送过程调用,这是没问题的。
现在,很多语言都有支持XML-RPC的库,包括C,C++,JAVA,.NET,Perl,Python都有。因此,不需要关心如何把函数调用转换成XML,然后怎么转换回调用。你只要把主要精力放在你的函数本身的逻辑上就行了。可以为你省很多事。
用C语言比较麻烦一些,毕竟C语言比较底层,你需要建立几个结构体和字符串,把函数名,以及参数的指针放进去,然后调一个函数来建立连接,调另一个发送远程调用。然后小心地处理异常。可以去看看下面的例子,C语言的。
http://xmlrpc-c.svn.sourceforge.net/viewvc/xmlrpc-c/trunk/examples/xmlrpc_sample_add_client.c?view=markup
真正精彩的是一些高层的语言,尤其是脚本语言,比如下面是一个Python的客户端,就3行:
import xmlrpclib
server = xmlrpclib.Server("http://www.example.com/RPC2")
result = server.calculate_a_plus_b(5,8)
嗯,这就行了。如果服务器设置正确,那么result就等于13了。
其实,server是一个对象,连接服务器用。server对象根本就没有calculate_a_plus_b这个方法。但是语言有“内省”能力,它如果你调用一个不存在的方法,会有特定的方法处理这样的调用。这里server对象自动将其转换成XML然后发送到服务器去,然后将返回值转换回native的类型。因此,乍一看,你根本就不知道这个“方法调用”是在远端的。
XML-RPC的不足:
毕竟要经过"函数调用"->XML转换过程,运行时要付出时间的代价。但是开发时间有时候比运行时效率更重要。
其它类似XML-RPC的协议:
SOAP:W3C提出的协议,功能比XML-RPC强大,但是太复杂。
各个语言的XML-RPC库:
C/C++: xmlrpc-c http://xmlrpc-c.sourceforge.net/
Java: Apache xmlrpc http://ws.apache.org/xmlrpc/
.NET: XML-RPC.net http://www.xml-rpc.net/
Perl: RPC::XML http://www.blackperl.com/RPC::XML/
Python,Ruby: 标准库里有。
这是一条镜像帖。来源:北邮人论坛 / www-technology / #3346同步于 2008/5/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
学习笔记:XML-RPC
wks
2008/5/30镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。