1、Web Service Web Service就是为应用程序提供的一个网络接口。客户端发送数据,服务端获取数据并进行处理,然后将结果返回给客户端,从而达到交互和分布式处理的效果,与平台、与开发语言无关。
2、WSDL文件 WSDL文件提供了一种对函数、函数参数及返回值描述的标准的xml文件.WSDL简化了开发流程,我们只要从服务提供商处获得相应接口的wsdl文件,通过该文件,利用软件自动生成客户端不同语言的代码。
3、搭建gSOAP环境 3.1 下载地址: 3.2 gSOAP环境搭建 unzip gsoap_2.8.9.zip
cd gsoap-2.8/src
make -f MakefileManual(生成soapcpp2)
cd gsoap-2.8/wsdl
make -f MakefileManual(生成wsdl2h)
4、示例程序 这里借用互联网上的一个例子。客户端输入两个数字,服务端提供加法函数服务并将结果返回给客户端。因为这个例子相对简单,就不用wsdl文件,而是直接从头文件开始生成代码。
4.1 创建工作目录 mkdir gSoapTest
4.2 拷贝所需文件 将gsoap源码包中的stdsoap2.c、stdsoap2.h及3.2中产生的soapcpp2拷贝到工作目录,如果有wsdl文件,则swdl2h也需要拷贝过来。
4.3 定义函数声明文件add.h,定义函数接口- int ns2__add( int num1, int num2, int* sum );
4.4 调用soapcpp2生成远程调用需要的文件 soapcpp2 -c add.h
4.5 创建服务端程序addserver.c- #include "soapH.h"
- #include "add.nsmap"
- int main(int argc, char **argv) {
- int m, s;
- struct soap add_soap;
- soap_init(&add_soap);
- soap_set_namespaces(&add_soap, namespaces);
- if (argc < 2) {
- printf("usage: %s \n", argv[0]);
- exit(1);
- } else {
- m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);
- if (m < 0) {
- soap_print_fault(&add_soap, stderr);
- exit(-1);
- }
- fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
- for (;;) {
- s = soap_accept(&add_soap);
- if (s < 0) {
- soap_print_fault(&add_soap, stderr);
- exit(-1);
- }
- fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
- soap_serve(&add_soap);
- soap_end(&add_soap);
- }
- }
- return 0;
- }
- int ns2__add(struct soap *add_soap, int num1, int num2, int *sum) {
- *sum = num1 + num2;
- return 0;
- }
4.6 创建客户端程序addclient.c- #include "soapStub.h"
- #include "add.nsmap"
- int add(const char *server, int num1, int num2, int *sum) {
- struct soap add_soap;
- int result = 0;
- soap_init(&add_soap);
- soap_set_namespaces(&add_soap, namespaces);
- soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);
- printf("server is %s, num1 is %d, num2 is %d\n", server, num1, num2);
- if (add_soap.error) {
- printf("soap error: %d, %s, %s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap));
- result = add_soap.error;
- }
- soap_end(&add_soap);
- soap_done(&add_soap);
- return result;
- }
4.7 创建测试程序addtest.c - #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int add(const char *server, int num1, int num2, int *sum);
- int main(int argc, char **argv) {
- int result = -1;
- char server[128] = {0};
- int num1;
- int num2;
- int sum;
- if (argc < 4) {
- printf("usage: %s num1 num2 \n", argv[0]);
- exit(1);
- }
- strcpy(server,argv[1]);
- num1 = atoi(argv[2]);
- num2 = atoi(argv[3]);
- result = add(server, num1, num2, &sum);
-
- if (result != 0) {
- printf("soap error, errcode=%d\n", result);
- } else {
- printf("%d + %d = %d\n", num1, num2, sum);
- }
- return 0;
- }
4.8 编译程序 gcc -o addserver addserver.c soapH.h stdsoap2.h stdsoap2.c soapServer.c soapC.c
gcc -o addclient addclient.c soapH.h stdsoap2.h stdsoap2.c soapClient.c soapC.c addtest.c
4.9 运行程序 Server端: ./addserver 7788
Client端: ./addclient 127.0.0.1:7788 45 55
4.10 工程包下载
阅读(6780) | 评论(0) | 转发(2) |