Chinaunix首页 | 论坛 | 博客
  • 博客访问: 331095
  • 博文数量: 100
  • 博客积分: 2620
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 02:50
文章分类

全部博文(100)

文章存档

2011年(5)

2010年(12)

2009年(83)

分类:

2009-12-10 22:48:28


xmlrpc初体验
 今天尝试了一下xmlrpc,感觉还可以,xmlrpc利用http传输xml的方式实现了网络传输协议和远程调用,使得我们无需关心协议实现细节,专心做业务就可以了。服务端只需要提供一些调用接口,将这些接口注册到xmlrpc中,客户端就可以来调用了。xmlrpc也支持异步调用,这样就不用死等一个响应了。
 但是,还没有看到xmlrpc怎么建立长连接,因为对于需要较高性能的服务器来说端连接是不能忍受的;另外,也没有看到服务端调用客户端的rpc方式,只能是客户端调用服务端的rpc。
下面贴一下安装和尝试的过程:
1.先再sf上下载一个新版本:
2.在linux系统上解压(linux版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga),64位)
#./configure
# make
出错:
说是XmlRpcCpp.o文件需要生成位置无关的版本,默认的makefile里面没有加,所有把需要的地方自己修改了一下:
./src/cpp/Makefile
XmlRpcCpp.o:%.o:%.cpp
        $(CXX) -c $(BASIC_INCLUDES) $(CXXFLAGS) $<
$(LIBXMLRPCPP_OBJS):%.o:%.cpp
        $(CXX) -c $(BASIC_INCLUDES) $(CXXFLAGS) $<
SERVER_INCLUDES = $(BASIC_INCLUDES) $(LIBXML_INCLUDES)
$(LIBXMLRPC_SERVERPP_OBJS):%.o:%.cpp
        $(CXX) -c $(SERVER_INCLUDES) $(CXXFLAGS) $<
SERVER_ABYSS_INCLUDES = $(SERVER_INCLUDES) -Isrcdir/lib/abyss/src
$(LIBXMLRPC_SERVER_ABYSSPP_OBJS):%.o:%.cpp
        $(CXX) -c $(SERVER_ABYSS_INCLUDES) $(CXXFLAGS) $<
CLIENT_INCLUDES = $(BASIC_INCLUDES) $(LIBXML_INCLUDES) $(TRANSPORT_INCLUDES)
$(LIBXMLRPC_CLIENTPP_OBJS):%.o:%.cpp
        $(CXX) -c $(CLIENT_INCLUDES) $(CXXFLAGS) $<
修改:
XmlRpcCpp.o:%.o:%.cpp
        $(CXX) -c -fPIC $(BASIC_INCLUDES) $(CXXFLAGS) $<
$(LIBXMLRPCPP_OBJS):%.o:%.cpp
        $(CXX) -c -fPIC $(BASIC_INCLUDES) $(CXXFLAGS) $<
SERVER_INCLUDES = $(BASIC_INCLUDES) $(LIBXML_INCLUDES)
$(LIBXMLRPC_SERVERPP_OBJS):%.o:%.cpp
        $(CXX) -c -fPIC $(SERVER_INCLUDES) $(CXXFLAGS) $<
SERVER_ABYSS_INCLUDES = $(SERVER_INCLUDES) -Isrcdir/lib/abyss/src
$(LIBXMLRPC_SERVER_ABYSSPP_OBJS):%.o:%.cpp
        $(CXX) -c -fPIC $(SERVER_ABYSS_INCLUDES) $(CXXFLAGS) $<
CLIENT_INCLUDES = $(BASIC_INCLUDES) $(LIBXML_INCLUDES) $(TRANSPORT_INCLUDES)
$(LIBXMLRPC_CLIENTPP_OBJS):%.o:%.cpp
        $(CXX) -c -fPIC $(CLIENT_INCLUDES) $(CXXFLAGS) $<
# make
# make install
安装成功了!
从抄了写例子来跑(自己做了些小改动)
server:
#include
#include
using namespace std;
#include
#include
#include
xmlrpc_value * sample_add(xmlrpc_env*   const envP,
                xmlrpc_value* const paramArrayP,
                void*   const channelInfo)
{
        xmlrpc_int32 x, y,z;
        xmlrpc_decompose_value(envP,paramArrayP,"(ii)",&x,&y);
        if(envP->fault_occurred)
                return NULL;
        z = x + y;
        if (y == 1)
        {  
                sleep(3);
        }  
        return xmlrpc_build_value(envP,"(ii)",z,x);
}
int main(int argc, char* argv[])
{
        xmlrpc_server_abyss_parms serverparm;
        xmlrpc_registry* registryP;
        xmlrpc_env env;
        xmlrpc_env_init(&env);
        registryP = xmlrpc_registry_new(&env);
        //xmlrpc_registry_add_method(&env,registryP,&methodInfo);
        xmlrpc_registry_add_method(&env,registryP,NULL,"sample.add",&sample_add,NULL);
        serverparm.config_file_name = NULL;
        serverparm.registryP        = registryP;
        serverparm.port_number      = 8888;
        serverparm.log_file_name    = "/tmp/xmlrpc_log";
        cout<<"running xml-rpc server...."<        xmlrpc_server_abyss(&env,&serverparm,XMLRPC_APSIZE(log_file_name));
        return 0;
}
编译:
g++ server.cpp -lxmlrpc_server -lpthread  -lxmlrpc_server_abyss -lxmlrpc -lxmlrpc_xmlparse -lxmlrpc_xmltok
(链了好多库啊。。。)
client:
#include
#include
using namespace std;
#include
#include
#define NAME "Xmlrpc-c Test Client"
#define VERSION "1.0.0.0"
void die_if_fault(xmlrpc_env* const envP)
{
        if(envP->fault_occurred)
        {  
                cout<<"xml-rpc fault:"<fault_string<<" code:"<fault_code<                exit(1);
        }  
}
int main(int argc, char* argv[])
{
        xmlrpc_env env;
        xmlrpc_value* resultP;
        xmlrpc_int32 sum,x;
        const char* const serverUrl = "";
        const char* const methodName = "sample.add";
        xmlrpc_env_init(&env);
        xmlrpc_client_init2(&env,XMLRPC_CLIENT_NO_FLAGS,NAME,VERSION,NULL,0);
        die_if_fault(&env);
        resultP = xmlrpc_client_call(&env,serverUrl,methodName,"(ii)",(xmlrpc_int32)atoi(argv[1]),(xmlrpc_int32)atoi(argv[2]));
        die_if_fault(&env);
        //xmlrpc_read_int(&env,resultP,&sum);
        xmlrpc_decompose_value(&env,resultP,"(ii)",&sum,&x);
       
        die_if_fault(&env);
        cout<<"sum:"<        cout<<"x:"<       
        xmlrpc_DECREF(resultP);
        xmlrpc_env_clean(&env);
        xmlrpc_client_cleanup();
       
        return 0;
}
编译:
g++ -g client.cpp -lxmlrpc_client -lpthread  -lxmlrpc -lxmlrpc_xmlparse -lxmlrpc_xmltok
运行的时候如果找不到库,就
#export LD_LIBRARY_PATH=/your/lib/dir
就这样简单测试了一下,还行,只是效率嘛,想想都不会太高,但是实现容易,开发效率高。说到开发效率,如果是比较简单的
应用,还不如用python来做,python实现rpc更简单。
阅读(7165) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-05-27 17:21:56

你好,可否交流一下xmlrpc。我的qq:1306496026