Ubuntu 下的webservices

搞 了一下午:

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

我们有两种做法:

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

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

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

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

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

给出代码:

1

[email protected]:/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 );

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

2 运行soapcpp2 -c add.h

3 加入一个服务端 addserver.c

[email protected]:/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 <server_port> /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

[email protected]:/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

[email protected]:/home/aries/Aries/gsoap# cat 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 <ip:port> 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

[email protected]:/home/aries/Aries/gsoap# cat makefile
GSOAP_ROOT = /mnt/hgfs/E/gsoap_2.8.17/gsoap-2.8/gsoap
WSNAME = add
CC = g++ -g -DWITH_NONAMESPACES
INCLUDE = -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.o

all: server
server: $(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
[email protected]:/home/aries/Aries/gsoap# make
g++ -g -DWITH_NONAMESPACES    -c -o soapC.o soapC.c
g++ -g -DWITH_NONAMESPACES    -c -o stdsoap2.o stdsoap2.c
g++ -g -DWITH_NONAMESPACES    -c -o soapServer.o soapServer.c
g++ -g -DWITH_NONAMESPACES    -c -o addserver.o addserver.c
g++ -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

效果:

时间: 2024-12-14 22:33:15

Ubuntu 下的webservices的相关文章

ubuntu下卸载python2和升级python3.5

卸载python只需一条语句就可以实现 sudu apt-get remove python ubuntu下安装python3 sudo apt-get install python3 但这样只安装了python3.4 要想使用python3.5,则必须升级python3.4 sudo add-apt-repository ppa:fkrull/deadsnakes sudo apt-get update sudo apt-get install python3.5 使用以上三行命令便可升级py

win7下的mstsc ubuntu下的rdesktop

远程图形化登录, win7下: 开始->mstsc->10.108.103.93即可进行后续输入账号密码验证登录. 功能类似rdesktop. 如图: win7下的mstsc ubuntu下的rdesktop,码迷,mamicode.com

Redis(三)-Ubuntu下安装

Ubuntu 下安装 在 Ubuntu 系统安装 Redi 可以使用以下命令: $sudo apt-get update $sudo apt-get install redis-server 启动 Redis $ redis-server 查看 redis 是否启动? $ redis-cli 以上命令将打开以下终端: redis 127.0.0.1:6379> 127.0.0.1 是本机 IP ,6379 是 redis 服务端口.现在我们输入 PING 命令. redis 127.0.0.1:

Ubuntu下apt-get命令详解

在Ubuntu下,apt-get近乎是最常用的shell命令之一了,因为他是Ubuntu通过新立得安装软件的常用工具命令. 本文列举了常用的APT命令参数: apt-cache search package 搜索软件包 apt-cache show package  获取包的相关信息,如说明.大小.版本等 sudo apt-get install package 安装包 sudo apt-get install package --reinstall   重新安装包 sudo apt-get -

ubuntu下可用的串口调试工具--cutecom

今天在ubuntu下要用到串口发送16进制数据,百度了很多工具,觉得minicom和cutecom都不错,比较直观是cutecom,所以就介绍下cutecom. 安装: 输入 $ sudo apt-get install cutecom    便可安装 $ cutecom                                    便可执行 这是软件截图: Device:这里是串口名称,但有时识别的串口不能在这里选择,比如ttyUSB0,需要手动修改为 /dev/ttyUSB0 Bau

Ubuntu下配置tftp服务和NFS服务

Ubuntu下配置tftp服务和NFS服务 配置tftp 方法一:(推荐方法)Ubuntu10.04 测试通过 1.安装TFTP软件 sudo apt-get install tftp-hpa tftpd-hpa tftp-hpa是客户端,tftpd-hpa是服务器端 2.建立tftpboot目录,作为服务器的目录sudo mkdir ~/tftpboot释放权限:(服务器目录,需要设置权限为777,chomd 777)sudo chmod 777 ~/tftpboot 3.配置TFTP服务器

ubuntu下docker安装与版本升级

ubuntu 下docker安装与版本升级 一.系统环境 系统:ubuntu-server 14.04 x86_64 内核:3.13.0-32-generic 二.Docker安装 --------------------------------------------------------------------------------- 要想安装最新版本的Docker需要使用Docker源来安装 $ sudo su - root # apt-get -y installapt-transp

在Ubuntu下编译Assimp库

在Ubuntu下编译Assimp库 如何在Ubuntu下编译Assimp库?这是我以前编译成功后做的笔记,供参考. 1.去下面的网站去下载Assimp库: http://assimp.sourceforge.net/ 2.安装cmake,似乎Assimp库只能通过cmake和vs工程文件进行构建,普通的makfile是通过它来产生的.Ubuntu下使用sudo apt-get install cmake.然后通过cmake --version查看cmake的版本,我cmake版本是2.8.11.

Ubuntu下部分软件的简介及其安装步骤

1.安装linux摄像头应用软件cheese sudo apt-get install cheese 2.Ubuntu Tweak    Ubuntu Tweak是一款专门为Ubuntu(GNOME桌面)准备的配置.调整工具.主要面向新手级的普通用户.它可以设置很多并不能在系统首选项中设置的隐藏选项,以满足用户自定义的乐趣.即使是新手,也可以方便地通过它来进行适合自己的系统调整.    安装命令:    第一步:添加tweak源 sudo add-apt-repository ppa:tuala