XMLRPC是什么?
关于节点建立连接的技术细节,官方文档说的非常简单,在这里ROS chnal Overview。没有基础的同学看这个介绍必然还是不懂。
在ROS中,节点与节点之间的依靠节点管理器(master)牵线搭桥。
master像一个中介,它介绍节点们互相认识。一旦节点们认识了以后,master就完成自己的任务了,它就不再掺和了。
这也是为什么你启动节点后再杀死master,节点之间的通信依然保持正常的原因。
使用过电驴和迅雷而且研究过BitTorrent的同学对master的工作方式应该很熟悉,master就相当于Trker服务器,它存储着其它节点的信息。
我们每次之前都会查询Tracker服务器,找到有电影资源的节点,然后就可以与它们建立连接并开始下载电影了。
那么master是怎么给节点牵线搭桥的呢?ROS使用了一种叫XMLRPC的方式实现这个功能。
XMLRPC中的RPC的意思是远程过程调用(Remote Procedure Call)。
简单来说,远程过程调用的意思就是一个计算机中的程序(在我们这就是节点啦)可以调用另一个计算机中的函数,只要这两个计算机在一个中。
这是一种听上去很高大上的功能,它能让节点去访问网络中另一台计算机上的程序资源。
XMLRPC中的XML我们在1.1节讲消息序列化时提到了,它就是一种数据表示方式而已。
所以合起来,XMLRPC的意思就是把由XML表示的数据发送给其它计算机上的程序运行。
运行后返回的结果仍然以XML格式返回回来,然后我们通过解析它(还原回纯粹的数据)就能干别的事了。
想了解更多XMLRPC的细节可以看这个XML-RPC:概述。
举个例子,一个XMLRPC请求是下面这个样子的。因为XMLRPC是基于HTTP协议的,所以下面的就是个标准的HTTP报文。
POST / HTTP/1.1
User-Agent: XMLRPC++ 0.7
Host: localhost:11311
Content-Type: text/xml
Content-length: 78
< ?xml version="1.0"? >
< methodCall >
< methodName >circleArea< /methodName >
< params >
< param >
< value >< double >2.41< /double >< /value >
< /param >
< /params >
< /methodCall >
如果你没学过HTTP协议,看上面的语句可能会感到陌生。《图解HTTP》这本小书可以让你快速入门。
HTTP报文比较简单,它分两部分,前半部分是头部,后半部分是主体。
头部和主体之间用空行分开,这都是HTTP协议规定的标准。
上面主体部分的格式就是XML,见的多了你就熟悉了。
所以,XMLRPC传递的消息其实就是主体部分是XML格式的HTTP报文而已,没什么神秘的。
对应客户端一个XMLRPC请求,服务器端会执行它并返回一个响应,它也是一个HTTP报文,如下。
它的结构和请求一样,不再解释了。所以,XMLRPC跟我们上网浏览网页的过程其实差不多。
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connecon: close
Content-Type: text/xml
Content-Length: 124
< ?xml version="1.0"? >
< methodResponse >
< params >
< param >
< value >< double >18.24668429131< /double >< /value >
< /param >
< /params >
< /methodResponse >