小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux下用gSOAP開發(fā)Web Service服務端和客戶端程序

 我的工作記錄 2012-08-06
 網(wǎng)上本有一篇流傳甚廣的C版本的,我參考來實現(xiàn),發(fā)現(xiàn)有不少問題,現(xiàn)在根據(jù)自己的開發(fā)經(jīng)驗將其修改,使用無誤;另外,補充同樣功能的C++版本,我想這個應該更有用,因為能用C++,當然好過受限于C。

1、gSOAP的安裝:

http:///projects/gsoap2/去下載最新版本,目前是:2.7.15

簡單安裝:

configure --prefix=/usr/local/gSOAP

       make

       make install

為了后面的C和C++版本的服務和客戶端的開發(fā)能夠脫離源代碼目錄,最好還要如下處理:

(1)將源代碼目錄下gsoap子目錄中的import目錄拷貝到gSOAP目錄下來;

(2)gSOAP目錄下建一個env目錄,將gsoap/samples/link下的所有文件拷貝過來,并且生成envC.o(C版本要用到),方法是:

/usr/local/gSOAP/bin/soapcpp2 -penv -c env.h

g++ -c -I /usr/local/gSOAP/include envC.c

(3)gSOAP目錄下建一個src目錄,將將源代碼目錄下gsoap子目錄中的stdsoap*.*拷貝過來。

 

2、功能說明:

       要開發(fā)的Web Service功能非常簡單,就是一個add函數(shù),將兩個參數(shù)相加,返回其和。

3、C版本的程序:

(1)頭文件:SmsWBS.h

//gsoap ns service name: SmsWBS
//gsoap ns service style: rpc
//gsoap ns service namespace: http://192.168.1.88:9000/SmsWBS.wsdl
//gsoap ns service location: http://192.168.1.88:9000
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:SmsWBS

int ns__add(int num1, int num2, int *sum);
這個頭文件需要注意的是,前面的 // 部分是有意義的,可以在上面修改,如果完全去掉,將會導致生成的中間文件不同,由此會引起要修改Makefile文件                                           

(2)Makefile文件:

比較關鍵,如果頭文件中的 // 部分有修改,要檢查是否要修改Makefile文件

GSOAP_ROOT=/usr/local/gSOAP
WSNAME0=soap
WSNAME=SmsWBS
CC=g++ -g -DWITH_NONAMESPACES
INCLUDE=-I $(GSOAP_ROOT)/include
SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)Server.o stdsoap2.o
CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME0)ClientLib.o stdsoap2.o
ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)Server.o ${WSNAME}test.o $(WSNAME0)ClientLib.o
#GSOAP_SRC=/usr/local/gsoap-2.7/gsoap

all:server

${WSNAME}.wsdl:${WSNAME}.h
        $(GSOAP_ROOT)/bin/soapcpp2 -c $(GSOAP_ROOT)/import ${WSNAME}.h

stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.c
        $(CC) -c $? $(INCLUDE)

$(ALL_OBJS):%.o:%.c
        $(CC) -c $? $(INCLUDE)

server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
        $(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server

client:Makefile ${WSNAME}.wsdl ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o
        $(CC) ${WSNAME}test.o $(CLIENT_OBJS) -o ${WSNAME}test

clean:
        rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME0)H.h $(WSNAME0)C.c $(WSNAME0)Server.c $(WSNAME0)Client.c $(WSNAME0)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME0)ServerLib.c $(WSNAME0)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test

 

(3)服務端程序SmsWBSserver.c:

#include "soapH.h"
#include "SmsWBS.nsmap"

int main(int argc, char **argv)
{
        int m, s;               /* master and slave sockets */
        struct soap SmsWBS_soap;

        soap_init(&SmsWBS_soap);

        soap_set_namespaces(&SmsWBS_soap, namespaces);

        if (argc < 2)
        {
                printf("usage: %s <server_port> \n", argv[0]);
                exit(1);
        }
        else
        {
                m = soap_bind(&SmsWBS_soap, NULL, atoi(argv[1]), 100);
                if (m < 0)
                {
                        soap_print_fault(&SmsWBS_soap, stderr);
                        exit(-1);
                }

                fprintf(stderr, "Socket connection successful: master socket = %d\n", m);

                for (;;)
                {
                        s = soap_accept(&SmsWBS_soap);

                        if (s < 0)
                        {
                                soap_print_fault(&SmsWBS_soap, stderr);
                                exit(-1);
                        }

                        fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
                        soap_serve(&SmsWBS_soap);
                        soap_end(&SmsWBS_soap);
                }

       }

        return 0;
}

int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
        *sum = num1 + num2;
        return 0;
}

 

(4)客戶端程序SmsWBStest.c:

#include <stdio.h>
#include <stdlib.h>
#include "soapStub.h"
#include "SmsWBS.nsmap"

int add(const char *server, int num1, int num2, int *sum);

int add(const char *server, int num1, int num2, int *sum)
{
        struct soap SmsWBS_soap;
        int result = 0;

        soap_init(&SmsWBS_soap);
        soap_set_namespaces(&SmsWBS_soap, namespaces);

        soap_call_ns__add(&SmsWBS_soap, server, "", num1, num2, sum);

        if(SmsWBS_soap.error)
        {
                printf("soap error:%d, %s, %s ", SmsWBS_soap.error, *soap_faultcode(&SmsWBS_soap), *soap_faultstring(&SmsWBS_soap));
                result = SmsWBS_soap.error;
         }

        soap_end(&SmsWBS_soap);
        soap_done(&SmsWBS_soap);

        return result;
}

int main(int argc, char **argv)
{
        int result = -1;
        char* server="http://localhost:9000";

        int num1 = 0;
        int num2 = 0;
        int sum = 0;

        if( argc < 3 )
        {
                printf("usage: %s num1 num2 \n", argv[0]);
                exit(0);

        }

        num1 = atoi(argv[1]);
        num2 = atoi(argv[2]);

        result = add(server, num1, num2, &sum);
        if (result != 0)
        {
                printf("soap err, errcode = %d \n", result);
        }
        else
        {
                printf("%d + %d = %d \n", num1, num2, sum);
        }

        return 0;
}

(5)編譯和運行:

前面都已經(jīng)準備好了,現(xiàn)在只需要:

make                                     ---得到服務端程序SmsWBSserver

make client                            ---得到客戶端程序SmsWBStest

SmsWBSserver 9000             ----運行服務端程序

出來類似下面的顯示就表示運行正常

Socket connection successful: master socket = 3

再運行客戶端程序:

SmsWBStest 67 78

顯示:

67 + 78 = 145

調(diào)用Web Service成功

 

續(xù)(二)

接(一)

 4、C++版本的程序:

(1)頭文件不變,還是SmsWBS.h

(2)Makefile文件:

GSOAP_ROOT=/usr/local/gSOAP
WSNAME0=soap
WSNAME=SmsWBS
CC=g++ -g -DWITH_NONAMESPACES
INCLUDE=-I $(GSOAP_ROOT)/include
SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)$(WSNAME)Service.o stdsoap2.o
CLIENT_OBJS=$(WSNAME0)$(WSNAME)Proxy.o $(WSNAME0)C.o stdsoap2.o
ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)$(WSNAME)Service.o $(WSNAME0)$(WSNAME)Proxy.o ${WSNAME}test.o
#GSOAP_SRC=/usr/local/gsoap-2.7/gsoap

all:server

${WSNAME}.wsdl:${WSNAME}.h
        $(GSOAP_ROOT)/bin/soapcpp2 -i $(GSOAP_ROOT)/import ${WSNAME}.h

stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.cpp
        $(CC) -c $? $(INCLUDE)

$(ALL_OBJS):%.o:%.cpp
        $(CC) -c $? $(INCLUDE)

server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
        $(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server

client:Makefile ${WSNAME}.wsdl ${WSNAME}test.cpp $(ALL_OBJS) stdsoap2.o
        $(CC) ${WSNAME}test.o $(CLIENT_OBJS) -o ${WSNAME}test

clean:
        rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME0)H.h $(WSNAME0)C.cpp $(WSNAME0)Server.cpp  $(WSNAME0)Stub.* $(WSNAME0)$(WSNAME)S
ervice.* $(WSNAME0)$(WSNAME)Proxy.* $(WSNAME0)$(WSNAME)Object.* $(WSNAME0)ServerLib.cpp $(WSNAME0)ClientLib.cpp $(WSNAME)server ns.x
sd $(WSNAME)test

(3)服務端程序SmsWBSserver.cpp:

#include "soapSmsWBSService.h"
#include "SmsWBS.nsmap"

int main(int argc, char **argv)
{
 SmsWBSService sms;

 if (argc < 2)
  sms.serve();       /* serve as CGI application */
 else
 {
  int port = atoi(argv[1]);

  if (!port)
  {
   fprintf(stderr, "Usage: SmsWBSserver++ <port>\n");
   exit(0);
  }

  /* run iterative server on port until fatal error */
  if (sms.run(port))
  {
   sms.soap_stream_fault(std::cerr);
   exit(-1);
  }
 }

 return 0;
}

int SmsWBSService::add(int num1, int num2, int *sum)
{
 *sum = num1 + num2;
 return SOAP_OK;
}

(4)客戶端程序SmsWBStest.cpp:

#include <stdio.h>
#include <stdlib.h>
#include "soapSmsWBSProxy.h"
#include "SmsWBS.nsmap"

int main(int argc, char **argv)
{
        int result = -1;
        char* server="http://localhost:9000";

        int num1 = 0;
        int num2 = 0;
        int sum = 0;

        if( argc < 3 )
        {
                printf("usage: %s num1 num2 \n", argv[0]);
                exit(0);
        }

        num1 = atoi(argv[1]);
        num2 = atoi(argv[2]);

        SmsWBSProxy  sms;
        result = sms.add(num1, num2, &sum);
        if (result != 0)
        {
                printf("soap err, errcode = %d \n", result);
        }
        else
        {
                printf("%d + %d = %d \n", num1, num2, sum);
        }

        return 0;
}

(5)編譯運行,與C版本類似,只是服務端運行時沒有提示信息

續(xù)(三)

接(二)

5、方便其它平臺調(diào)用Web Service服務所需要做的工作:

以上的C和C++版本的Web Service服務端運行后,在本機或者其它機(windows系統(tǒng)也一樣)瀏覽器中輸入http://192.168.1.88:9000/SmsWBS?wsdl,會返回XML文件內(nèi)容,但是并無Web Service的功能函數(shù)描述,原因是尚未實現(xiàn)允許客戶端通過http的get操作來獲取 SmsWBS.wsdl文件。因此,需要補充實現(xiàn)這一部分,以C++版本為例,完善后的SmsWBSserver.cpp程序是:

#include "soapSmsWBSService.h"
#include "SmsWBS.nsmap"

int http_get(struct soap * soap);

int main(int argc, char **argv)
{
 SmsWBSService sms;

 if (argc < 2)
  sms.serve();       /* serve as CGI application */
 else
 {
  int port = atoi(argv[1]);

  if (!port)
  {
   fprintf(stderr, "Usage: SmsWBSserver++ <port>\n");
   exit(0);
  }

  /* run iterative server on port until fatal error */
  sms.fget = http_get;

  if (sms.run(port))
  {
   sms.soap_stream_fault(std::cerr);
   exit(-1);
  }
 }

 return 0;
}

int SmsWBSService::add(int num1, int num2, int *sum)
{
 *sum = num1 + num2;
 return SOAP_OK;
}

//能夠遠程讀取wsdl文件
int http_get(struct soap * soap)
{
 FILE *fd = NULL;

 char *s = strchr(soap->path, '?');
 if (!s || strcmp(s, "?wsdl"))
  return SOAP_GET_METHOD;

 fd = fopen("SmsWBS.wsdl", "rb");

 if (!fd)
  return 404;

 soap->http_content = "text/xml";

 soap_response(soap, SOAP_FILE);

 for (;;)
 {
 size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
 if (!r)
   break;
 if (soap_send_raw(soap, soap->tmpbuf, r))
   break;
 }

 fclose(fd);
 soap_end_send(soap);

 return SOAP_OK;
}


重新將服務端編譯,運行后http://192.168.1.88:9000/SmsWBS?wsdl能夠獲取到完整的SmsWBS.wsdl。

至此,可以在windows下的VC++.Net項目中通過“添加WEB 引用”來方便地生成客戶端類文件,從而調(diào)用Web Service服務端的功能。

 (全文完)

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多