2021SC@SDUSC
目录
1.写在前面
在上一篇博客中,我们分析了ROS实现多线程处理请求所依赖的线程池的实现方式.从本篇开始,我们将在服务器类的继承层次上自顶向下地分析其处理服务功能的内在实现.
2. XML-RPC简介
在本系列的综述中已经提到过,ROS功能组件称为node,不同的node以ros-core为中介来实现功能上的相互沟通与协作.而其在Java版本的底层实现使用了名为XML-RPC的技术.
Remote Procedure Call(RPC)即远程过程调用,是一种跨进程通信的方式,特别是能够跨不同的主机进行进行通信以调用远程方法.这一特点使得ROS的各种node能够分布式地运行在不同的主机上从而大大提高了ROS的可扩展性.
(RPC通信机制示意)
RPC需要调用者和服务者同时运行RPC程序,RPC客户端和服务器通过sockets相互连接,然后方法调用者使用需要调用方法句柄附加上参数请求服务器,服务器在使用相应参数执行完成方法后将结果返回.这样一种机制使调用者调用远程方法就像调用本地方法一样,是一种十分方便的跨进程、跨主机通信策略.对于其参数的传递,需要以结构化的形式封装,因此xml、json等都是可行的选择.使用xml传递参数相比其他方法具有一定的优点,比如xml结构化程度高,能够对参数的层次和类别进行有效的封装,另外xml的约束文件也可以对参数名称的取值等一些元数据进行有效性保障,使得RPC的安全性得到提高.
3、ROS RPC实现简介
(功能示意)
简单来说,ros-core就是为了维护各种node的数据并对其提供支持而存在的,主要包括publisher/subscriber的注册与注销、service的注册与注销并负责提供向订阅者发布topic,接受已注册service的调用等.这些功能的实现依赖ros-core的数据成员masterServer.
MasterServer类作为XML-RPC的高层类,负责publisher/subscriber的注册与注销、service的注册与注销.
MasterServer的父类为XmlRpcServer,XmlRpcServer主要负责各种功能的node的注册与方法句柄的解析,并对并发请求进行控制.XmlRpcServer类的成员WebServer负责校验地址、监听socket连接并为其分配worker处理其请求.
从本章开始,我们将以WebServer为起点,自上而下分析其RPC功能的实现.
(WebServer类示意图)
4.WebServer源码分析
1、
protected ServerSocket serverSocket;
private Thread listener;
private ThreadPool pool;
protected final List accept = new ArrayList();
protected final List deny = new ArrayList();
protected final XmlRpcStreamServer server = newXmlRpcStreamServer();
private InetAddress address;
private int port;
private boolean paranoid;
static final String HTTP_11 = "HTTP/1.1";
WebServer的数据成员如上图所示.ServerSocket负