博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ubuntu 下的webservices
阅读量:5775 次
发布时间:2019-06-18

本文共 4849 字,大约阅读时间需要 16 分钟。

搞 了一下午:

开发server程序。需使用gSOAP生成server端代码框架。

我们有两种做法:

  1. 编写WSDL,使用wsdl2h生成头文件,再soapcpp2生成框架代码。
  2. 编写头文件。使用soapcpp2生成框架代码;

这两种方式。结果是一样的。终于都有产生头文件。并生成代码。不同在于。在项目的开发中须要维护的文件不同。前者是须要维护WSDL文件,后者维护头文件。

我个人认为另外一种方式更好用,不不过少了个步骤。而是WSDL的语法太难写了,有点XSD的味道。而头文件的编写。更接近于程序猿的思考方式,比方定义消息结构,定义接口名称等。

gSOAP是很智能的,它利用C/C++的凝视来获取信息,所以在手工编写的头文件里,凝视是用用处的。常以// gsoap 名字空间 …开头。

做为学习。我准备为php blog程序wordpress写一个web service接口。名字叫wpsoap。

给出代码:

root@ubuntu:/home/aries/Aries/gsoap# cat add.h //gsoapopt cw//gsoap ns2 schema namespace: urn:add//gsoap ns2 schema form: unqualified//gsoap ns2 service name: add//gsoap ns2 service type: addPortType//gsoap ns2 service port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi//gsoap ns2 service namespace: urn:add//gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http//gsoap ns2  service method-style:      add rpc//gsoap ns2  service method-encoding:   //add http://schemas.xmlsoap.org/soap/encoding///gsoap ns2  service method-action:     add ""int ns2__add( int num1, int num2, int* sum );

注意:凝视的的内容也必须加上

运行soapcpp2 -c add.h

3 加入一个服务端 addserver.c

root@ubuntu:/home/aries/Aries/gsoap# cat 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 t加入 客服端 addclient.c

root@ubuntu:/home/aries/Aries/gsoap# cat 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;}
5 測试 上面的addtest.c

root@ubuntu:/home/aries/Aries/gsoap# cat addtest.c#include 
#include
#include
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;}
注意:编译的时候我们须要gsoap包里的源码文件,把stdsoap2.c和stdsoap2.h文件复制到当前文件夹

6 makefile

root@ubuntu:/home/aries/Aries/gsoap# cat makefileGSOAP_ROOT = /mnt/hgfs/E/gsoap_2.8.17/gsoap-2.8/gsoapWSNAME = addCC = g++ -g -DWITH_NONAMESPACESINCLUDE = -I$(GSOAP_ROOT)SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.o CLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.oall: serverserver: $(SERVER_OBJS) 	$(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS) client: $(CLIENT_OBJS) 	$(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)cl:	rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test
root@ubuntu:/home/aries/Aries/gsoap# makeg++ -g -DWITH_NONAMESPACES    -c -o soapC.o soapC.cg++ -g -DWITH_NONAMESPACES    -c -o stdsoap2.o stdsoap2.cg++ -g -DWITH_NONAMESPACES    -c -o soapServer.o soapServer.cg++ -g -DWITH_NONAMESPACES    -c -o addserver.o addserver.cg++ -g -DWITH_NONAMESPACES -I/mnt/hgfs/E/gsoap_2.8.17/gsoap-2.8/gsoap -o addserver soapC.o stdsoap2.o soapServer.o addserver.o
继续 make client

最后 文件例如以下:

add.add.req.xml  addserver    makefile         soapH.h          stdsoap2.h

add.add.res.xml  addserver.c  soapC.c          soapServer.c     stdsoap2.o
addclient.c      addserver.o  soapClient.c     soapServerLib.c
addclient.o      addtest      soapClientLib.c  soapServer.o
add.h            addtest.c    soapClient.o     soapStub.h
add.nsmap        addtest.o    soapC.o          stdsoap2.c

效果:

你可能感兴趣的文章
结构体和类的内存对齐原则-这一次弄清楚了对齐的本质规则
查看>>
Centos编译安装Nginx和PHP
查看>>
Linux-grep命令
查看>>
exgcd、二元一次不定方程学习笔记
查看>>
经典sql
查看>>
CSS3边框会动的信封
查看>>
JavaWeb实例设计思路(订单管理系统)
查看>>
source insight中的快捷键总结
查看>>
PC-IIS因为端口问题报错的解决方法
查看>>
java四种线程池简介,使用
查看>>
一般处理程序(.ashx)中session的使用方法
查看>>
EasyUI笔记(二)Layout布局
查看>>
ios View之间的切换 屏幕旋转
查看>>
typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);语句的理解
查看>>
jsp 特殊标签
查看>>
[BZOJ] 1012 [JSOI2008]最大数maxnumber
查看>>
使用VMware安装CentOS
查看>>
gauss消元
查看>>
多线程-ReentrantLock
查看>>
数据结构之链表与哈希表
查看>>