最近在搞利用xmlrpc协议与java端通信,其好处就是可以跨平台通信java、c、PHP、c++都支持。首先需要去sourceforge网站去下载xmlrpc库安装在系统上,我用c实现了一个服务端,c服务端最主要的是这个函数xmlrpc_decompose_value,稍后讲解,以下是c服务端代码,java客户端没有贴:
static xmlrpc_value *
setRule(xmlrpc_env * const envP,xmlrpc_value * const paramArrayP,void * const usr_data)//方法对应的函数
{xmlrpc_value *arrayP;xmlrpc_value *retval;char * getXmlString;xmlrpc_decompose_value(envP, paramArrayP, "(s)", &getXmlString);//解析客户端传来的内容,其中第三个参数是格式,第四个参数是变量,格式可以为多个,参数也可以为多个。这里为"(s)",是以字符串解析,getXmlString(char *型)指向解析到的结果。如果为“(i)”,那么就是以int型解析,解析的结果(第四个参数)应该为int型变量。也可以是这种形式"(ii)"、"(is)",这说明解析的参数为两个,分别为int型和int型、int型和字符串型,后面的接受参数也应该为两个。"(A)"是以字符数组解析,“(S)”大写S是以结构体解析等等,具体解析格式可以参考xmlrpc函数手册,google之。if(envP->fault_occurred)return NULL;else{printf("getXmlString :%s\n",getXmlRule);pthread_mutex_lock(&xml_parse_mutex);parse_xml_string(getXmlString, strlen(getXmlString));//此函数忽略pthread_mutex_unlock(&xml_parse_mutex);}free((void *)getXmlRule);
static void * XmlRpcListenThreadFunc(void *args)
{xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(log_file_name));//c服务端return NULL;
}
static void XmlRpcStartListenThread()
{pthread_t xmlrpc_listen_thread;pthread_create(&xmlrpc_listen_thread, NULL, (void*)XmlRpcListenThreadFunc, NULL);//创建线程pthread_detach(xmlrpc_listen_thread);
}
<pre name="code" class="plain">int main(){//struct xmlrpc_method_info3 const methodInfo = {// "nprobe.setRule",// &nprobe_setRule,//};xmlrpc_registry * registryP;xmlrpc_env_init(&env);xmlrpc_server_abyss_global_init(&env);registryP = xmlrpc_registry_new(&env);xmlrpc_registry_add_method(&env, registryP, NULL, "setRule",&setRule, NULL);//这里的"setRule"是客户端、服务端通信的方法名,类似于一种约定,setRule是方法对应的执行函数,一旦受到客户端的setRule方法,就会执行此函数。serverparm.config_file_name = NULL;serverparm.registryP = registryP;serverparm.port_number = 9200;//端口serverparm.log_file_name = NULL;XmlRpcStartListenThread();//监听线程<pre name="code" class="plain"> while(1){sleep(2);}return 0;
}