網(wǎng)上本有一篇流傳甚廣的C版本的,我參考來(lái)實(shí)現(xiàn),發(fā)現(xiàn)有不少問(wèn)題,現(xiàn)在根據(jù)自己的開發(fā)經(jīng)驗(yàn)將其修改,使用無(wú)誤;另外,補(bǔ)充同樣功能的C++版本,我想這個(gè)應(yīng)該更有用,因?yàn)槟苡肅++,當(dāng)然好過(guò)受限于C。
1、gSOAP的安裝: 到http:///projects/gsoap2/去下載最新版本,目前是:2.7.15 簡(jiǎn)單安裝: configure --prefix=/usr/local/gSOAP make make install 為了后面的C和C++版本的服務(wù)和客戶端的開發(fā)能夠脫離源代碼目錄,最好還要如下處理: (1)將源代碼目錄下gsoap子目錄中的imp (2)gSOAP目錄下建一個(gè)env目錄,將gsoap/samples/link下的所有文件拷貝過(guò)來(lái),并且生成envC.o(C版本要用到),方法是: /usr/local/gSOAP/bin/soapcpp2 -penv -c env.h g++ -c -I /usr/local/gSOAP/include envC.c (3)gSOAP目錄下建一個(gè)src目錄,將將源代碼目錄下gsoap子目錄中的stdsoap*.*拷貝過(guò)來(lái)。
2、功能說(shuō)明: 要開發(fā)的Web Service功能非常簡(jiǎn)單,就是一個(gè)add函數(shù),將兩個(gè)參數(shù)相加,返回其和。 3、C版本的程序: (1)頭文件:SmsWBS.h //gsoap ns service name: SmsWBS int ns__add(int num1, int num2, int *sum); (2)Makefile文件: 比較關(guān)鍵,如果頭文件中的 // 部分有修改,要檢查是否要修改Makefile文件 GSOAP_ROOT=/usr/local/gSOAP all:server ${WSNAME}.wsdl:${WSNAME}.h stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.c $(ALL_OBJS):%.o:%.c server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS) client:Makefile ${WSNAME}.wsdl ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o clean:
(3)服務(wù)端程序SmsWBSserver.c: #include "soapH.h" int main(int argc, char **argv) soap_init(&SmsWBS_soap); soap_set_namespaces(&SmsWBS_soap, namespaces); if (argc < 2) fprintf(stderr, "Socket connection successful: master socket = %d\n", m); for (;;) if (s < 0) fprintf(stderr, "Socket connection successful: slave socket = %d\n", s); } return 0; int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
(4)客戶端程序SmsWBStest.c: #include <stdio.h> int add(const char *server, int num1, int num2, int *sum); int add(const char *server, int num1, int num2, int *sum) soap_init(&SmsWBS_soap); soap_call_ns__add(&SmsWBS_soap, server, "", num1, num2, sum); if(SmsWBS_soap.error) soap_end(&SmsWBS_soap); return result; int main(int argc, char **argv) int num1 = 0; if( argc < 3 ) } num1 = atoi(argv[1]); result = add(server, num1, num2, &sum); return 0; (5)編譯和運(yùn)行: 前面都已經(jīng)準(zhǔn)備好了,現(xiàn)在只需要: make ---得到服務(wù)端程序SmsWBSserver make client ---得到客戶端程序SmsWBStest SmsWBSserver 9000 ----運(yùn)行服務(wù)端程序 出來(lái)類似下面的顯示就表示運(yùn)行正常 Socket connection successful: master socket = 3 再運(yùn)行客戶端程序: SmsWBStest 67 78 顯示: 67 + 78 = 145 調(diào)用Web Service成功
續(xù)(二) 接(一) 4、C++版本的程序: (1)頭文件不變,還是SmsWBS.h (2)Makefile文件: GSOAP_ROOT=/usr/local/gSOAP all:server ${WSNAME}.wsdl:${WSNAME}.h stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.cpp $(ALL_OBJS):%.o:%.cpp server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS) client:Makefile ${WSNAME}.wsdl ${WSNAME}test.cpp $(ALL_OBJS) stdsoap2.o clean: (3)服務(wù)端程序SmsWBSserver.cpp: #include "soapSmsWBSService.h" int main(int argc, char **argv) if (argc < 2) if (!port) /* run iterative server on port until fatal error */ return 0; int SmsWBSService::add(int num1, int num2, int *sum) (4)客戶端程序SmsWBStest.cpp: #include <stdio.h> int main(int argc, char **argv) int num1 = 0; if( argc < 3 ) num1 = atoi(argv[1]); SmsWBSProxy sms; return 0; (5)編譯運(yùn)行,與C版本類似,只是服務(wù)端運(yùn)行時(shí)沒(méi)有提示信息 續(xù)(三) 接(二) 5、方便其它平臺(tái)調(diào)用Web Service服務(wù)所需要做的工作: 以上的C和C++版本的Web Service服務(wù)端運(yùn)行后,在本機(jī)或者其它機(jī)(windows系統(tǒng)也一樣)瀏覽器中輸入http://192.168.1.88:9000/SmsWBS?wsdl,會(huì)返回XML文件內(nèi)容,但是并無(wú)Web Service的功能函數(shù)描述,原因是尚未實(shí)現(xiàn)允許客戶端通過(guò)http的get操作來(lái)獲取 SmsWBS.wsdl文件。因此,需要補(bǔ)充實(shí)現(xiàn)這一部分,以C++版本為例,完善后的SmsWBSserver.cpp程序是: #include "soapSmsWBSService.h" int http_get(struct soap * soap); int main(int argc, char **argv) if (argc < 2) if (!port) /* run iterative server on port until fatal error */ if (sms.run(port)) return 0; int SmsWBSService::add(int num1, int num2, int *sum) //能夠遠(yuǎn)程讀取wsdl文件 char *s = strchr(soap->path, '?'); fd = fopen("SmsWBS.wsdl", "rb"); if (!fd) soap->http_content = "text/xml"; soap_response(soap, SOAP_FILE); for (;;) fclose(fd); return SOAP_OK;
至此,可以在windows下的VC++.Net項(xiàng)目中通過(guò)“添加WEB 引用”來(lái)方便地生成客戶端類文件,從而調(diào)用Web Service服務(wù)端的功能。 (全文完) |
|