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更简单。
阅读(7126) | 评论(1) | 转发(0) |