ROS_Xmlrpc++ 简单示例

本文介绍了一个使用C++实现的简单XML-RPC服务器示例,包括服务器端和客户端的代码实现,展示了如何通过XML-RPC进行远程过程调用。

根据 https://www.ibm.com/developerworks/cn/webservices/ws-xml-rpc/代码修改而来:
XmlRpc 简单代码示例


operations.h:
 #ifndef OPERATIONS
 #define OPERATIONS
 class operations {
 public:
  int add();
  operations(int i,int j);
 private :
  int op1;
  int op2;
 };
 #endif // OPERATIONS
 
operations.cpp :
 #include <iostream>
 #include "operations.h"
 int operations::add(){
  std::cout<< "Sum of " <<op1<<"+"<<op2<<"="<<op1+op2<<std::endl;
  return (op1+op2);
 }
 operations::operations(int i,int j){
  this->op1 = i;
  this->op2 = j;
 }

 

myxmlrpcserver.h:
 #ifndef MYXMLRPCSERVER
 #define MYXMLRPCSERVER
 #include <iostream>
 #include "myxmlrpcservermethods.h"
 #include "XmlRpc.h"

 class myXmlRpcServer
 {
 public:
  myXmlRpcServer() ;
  ~myXmlRpcServer();
  void run();
 private:
  void  pm_registerMethods();
  XmlRpc::XmlRpcServer pm_xmlRpcserver;
  std::list<myXmlRpcServerMethod*> pm_serverMethods;
 };

 #endif // MYXMLRPCSERVER

myxmlrpcserver.cpp  :
 #include "myxmlrpcserver.h"
 #include <iostream>

 myXmlRpcServer::myXmlRpcServer(){
    pm_registerMethods();
    int port = 8085;
    pm_xmlRpcserver.bindAndListen(port);
    std::cout<<"XmlRpcServer running  in port " << port<<std::endl;
 }
 myXmlRpcServer::~myXmlRpcServer(){
 }

 void myXmlRpcServer::pm_registerMethods(){
  Add* a = new Add(&pm_xmlRpcserver);
  myXmlRpcServerMethod *p=a;
  pm_serverMethods.push_back(p);
 }
 void myXmlRpcServer::run(){
  pm_xmlRpcserver.work(-1);
 }

myxmlrpcservermethods.h:
 #ifndef MYXMLRPCSERVERMETHODS
 #define MYXMLRPCSERVERMETHODS
 #include <iostream>
 #include <XmlRpc.h>
 #include "myxmlrpcserver.h"

 using namespace XmlRpc;
 class myXmlRpcServerMethod :  public XmlRpcServerMethod {
 public:
  myXmlRpcServerMethod(const char *name,XmlRpcServer *server):
  XmlRpcServerMethod(name,server){}
  virtual void execute(XmlRpcValue  &params,XmlRpcValue &result){ }
 };
 class Add:public myXmlRpcServerMethod{
 public:
  Add(XmlRpcServer *s);
  virtual void execute(XmlRpcValue &params,XmlRpcValue &result);
 };

#endif // MYXMLRPCSERVERMETHODS


myxmlrpcservermethods.cpp:
 #include <iostream>
 #include "myxmlrpcserver.h"
 #include <XmlRpc.h>
 #include "operations.h"
 using namespace std;
 using XmlRpc::XmlRpcException;
 Add::Add(XmlRpcServer*s) :myXmlRpcServerMethod("Add",s){}
 void Add::execute(XmlRpcValue &params, XmlRpcValue &result){
    operations a(10,12);
    try{
     cout<<"Inside Add::execute method\n";
     result = a.add();
    }catch(std::exception &stde){
     throw XmlRpcException(stde.what());
    }
 }
服务器端:

#include <iostream>
#include "myxmlrpcserver.h"
using std;
int main(int argc ,char *argv[]){

    myXmlRpcServer GeeBoomBaa;
    std::cout<<"About to run the server\n";
    GeeBoomBaa.run();
    return 0;

 
 
客户端:
#include <iostream>
#include "myxmlrpcserver.h"
using namespace XmlRpc;
int main(int argc, char* argv[])
{
        const char *server = "localhost";
        const int port = 8085;
        const char *uri = NULL;
        XmlRpcValue args, res;
        XmlRpcClient c( server, port, uri);
        c.execute("Add", args, res);
        std::cout<<"result is "<<res<<std::endl;
}

 

 

 

... logging to /home/ol/.ros/log/35375ccc-879b-11f0-93a4-512b815a801d/roslaunch-01-3519.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. invalid ROS_IP (must be a valid IPv4 or IPv6 address) invalid ROS_IP (must be a valid IPv4 or IPv6 address) Traceback (most recent call last): File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/__init__.py", line 347, in main p.start() File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/parent.py", line 305, in start self._start_infrastructure() File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/parent.py", line 263, in _start_infrastructure self._start_server() File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/parent.py", line 212, in _start_server self.server.start() File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/server.py", line 386, in start code, msg, val = ServerProxy(self.uri).get_pid() File "/usr/lib/python3.8/xmlrpc/client.py", line 1109, in __call__ return self.__send(self.__name, args) File "/usr/lib/python3.8/xmlrpc/client.py", line 1450, in __request response = self.__transport.request( File "/usr/lib/python3.8/xmlrpc/client.py", line 1153, in request return self.single_request(host, handler, request_body, verbose) File "/usr/lib/python3.8/xmlrpc/client.py", line 1165, in single_request http_conn = self.send_request(host, handler, request_body, verbose) File "/usr/lib/python3.8/xmlrpc/client.py", line 1266, in send_request connection = self.make_connection(host) File "/usr/lib/python3.8/xmlrpc/client.py", line 1243, in make_connection self._connection = host, http.client.HTTPConnection(chost) File "/usr/lib/python3.8/http/client.py", line 836, in __init__ self._validate_host(self.host) File "/usr/lib/python3.8/http/client.py", line 1209, in _validate_host raise InvalidURL(f"URL can't contain control characters. {host!r} " http.client.InvalidURL: URL can't contain control characters. 'hostname -I' (found at least ' ')
最新发布
09-03
#include "ucar_solution.h" using namespace std; using namespace Eigen; //标准 namespace ucar_solution { Solution::Solution(ros::NodeHandle &nh) { ros::NodeHandle navi_nh(nh, "navigation"); //ros::NodeHandle speed_nh(nh, "speed"); mbf_client_ = std::make_unique<actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction>>("move_base", true); if (!mbf_client_->waitForServer(ros::Duration(10.0))) { ROS_INFO("Waiting for the move_base action server to come up"); } target_sub = nh.subscribe("/target_msg", 100, &Solution::solutionCallback, this); start_sub = nh.subscribe("/ucar/is_start", 100, &Solution::startCallback, this); cmd_pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 50); scan_sub_ = nh.subscribe("/scan", 1000, &Solution::scanCallback, this); rpy_sub_ = nh.subscribe("/rpy_topic", 100, &Solution::rpyCallback, this); scan_mode_pub_ = nh.advertise<std_msgs::Int32>("/scan_mode", 10); scan_start_pub_ = nh.advertise<std_msgs::Bool>("/scan_start", 10); detect_start_pub_ = nh.advertise<std_msgs::Bool>("/detect_start", 10); follow_start_pub_ = nh.advertise<std_msgs::Bool>("/follow_start", 10); pidInit(0.01, 0.003, 0.005, 960,-0.3); XmlRpc::XmlRpcValue patrol_list; navi_nh.getParam("speed", MAX_LIMIT); navi_nh.getParam("goal_list", patrol_list); for (int i = 0; i < patrol_list.size(); ++i) { ROS_ASSERT(patrol_list[i].getType() == XmlRpc::XmlRpcValue::TypeArray); geometry_msgs::PoseStamped pose_stamped; pose_stamped.header.frame_id = "map"; ROS_ASSERT(patrol_list[i][0].getType() == XmlRpc::XmlRpcValue::TypeDouble and patrol_list[i][1].getType() == XmlRpc::XmlRpcValue::TypeDouble and patrol_list[i][2].getType() == XmlRpc::XmlRpcValue::TypeDouble); pose_stamped.pose.position
03-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值