• 〖Linux〗使用gsoap搭建web server(C++)


    1. gsoap的好处就不用说了:百度百科

    2. gsoap的下载地址:项目地址,目前我使用的是2.8.15版本

    3. 开发环境:Ubuntu13.10

    4. 具体操作步骤(以简单相加为例):

      1)编写add.h(头文件)

    //gsoap ns service name: calc
    //gsoap ns service protocol: SOAP
    //gsoap ns service style: rpc
    //gsoap ns service encoding: encoded
    //gsoap ns service namespace:    http://localhost:8888
    //gsoap ns service location:    http://localhost:8888
    //gsoap ns service port:    http://localhost:8888
     
    int ns__add( int num1, int num2, int* sum );

      2)编写addserver.cpp(服务器)

    #include "soapcalcService.h"                    /* 与add.h中第一行ns有关 */
    #include "calc.nsmap"                           /* 与add.h中第一行ns有关 */
    
    int main(int argc, char **argv)
    { calcService calc;                             /* 创建calc对象 */
      if (argc < 2)
        calc.serve();    /* serve as CGI application */
      else
      { int port = atoi(argv[1]);
        if (!port)
        { fprintf(stderr, "Usage: server <port>
    ");
          exit(0);
        }
        /* run iterative server on port until fatal error */
        if (calc.run(port))                         /* 运行在port端口上 */
        { calc.soap_stream_fault(std::cerr);
          exit(-1);
        }
      }
      return 0;
    } 
    
    int calcService::add(int a, int b, int *result) /* 在此处实现add() */
    { *result = a + b;
      return SOAP_OK;
    } 

      3)编写addclient.cpp(客户端)

    #include "soapcalcProxy.h"                      /* 与add.h第一行的ns有关 */
    #include "calc.nsmap"                           /* 与add.h第一行的ns有关 */
    #include <stdio.h>
    #include <stdlib.h>
    const char server[] = "127.0.0.1:4567";
    
    int main(int argc, char **argv)
    { if (argc < 3)
      { fprintf(stderr, "Usage: client num1 num2
    ");
        exit(0);
      }
      int a, b, result;
      a = (int)(strtod(argv[1], NULL));             /* str转double再转int */
      b = (int)(strtod(argv[2], NULL));
      calcProxy calc;                               /* 创建calc对象 */
      calc.soap_endpoint = server;                  /* 设定server */
      calc.add(a, b, &result);                      /* 执行add() */
      if (calc.error)
        calc.soap_stream_fault(std::cerr);
      else
        printf("result = %d
    ", result);            /* 打印消息 */
      return 0;
    }

      4)编写Makefile文件

    # this is a Makefile to build client and server
    # please setting the GSOAP_ROOT first.
    # build procedure(EXAMPLE): server run on pc, then client run on arm
    #     step1: setting GSOAP_ROOT
    #     step2: setting OBJ_NS   # the first line in add.h
    #     step3: setting OBJ_NAME  # the basename of filename of add.h
    #     step4: setting CC and CXX
    #     step4: make
    
    OBJ_NS := calc
    OBJ_NAME := add
    GSOAP_ROOT := /home/scue/work/gsoap_2.8.15/gsoap
    INCLUDE := -I$(GSOAP_ROOT)
    
    CC := clang++
    GCC := clang++
    #CC := arm-linux-g++
    #CXX := arm-linux-g++
    
    CFLAGS += -w
    CXXFLAGS += -w
    
    OBJ_SERVER := soapC.o stdsoap2.o soap$(OBJ_NS)Service.o $(OBJ_NAME)server.o
    OBJ_CLIENT := soapC.o stdsoap2.o soap$(OBJ_NS)Proxy.o $(OBJ_NAME)client.o
    
    all: 
        @make soap
        @make server
        @make client 
    
    server: $(OBJ_SERVER)
        $(CXX) $(CXXFLAGS) $(INCLUDE) $^ -o $@
    client: $(OBJ_CLIENT)
        $(CXX) $(CXXFLAGS) $(INCLUDE) $^ -o $@
    
    .PHONY:soap
    soap:
        @cp -v $(GSOAP_ROOT)/stdsoap2.* .
        @$(GSOAP_ROOT)/bin/linux386/soapcpp2 -i $(OBJ_NAME).h
    
    soapqt:
        @mkdir -p $(OBJ_NS)qtclient
        @cp -v soapH.h soapStub.h stdsoap2.h soap$(OBJ_NS)Proxy.h 
            soapC.cpp stdsoap2.cpp soap$(OBJ_NS)Proxy.cpp $(OBJ_NS).nsmap 
            $(OBJ_NS)qtclient/
    
    # -c 生成C的文件
    # -i 生成C++的文件
    
    .PHONY:clean
    clean:
        rm -f server client *.o
    distclean:
        rm -f server client *.o ns* soap* *.xml *.nsmap *.wsdl stdsoap2.*

      5)编译及试验

    make
    ./server 4567
    ./client 2 3 #将会返回5,也可以直接在浏览器中输入http://localhost:4567进行验证

    总结:使用C++编写将会轻松很多。

  • 相关阅读:
    面向对象
    tomcat启动时的java_home和jre_home错误
    C#获取当前程序运行路径的方法集合(转)
    Windows Media Player 打不开怎么办
    CGI/MIME/servlet术语解释
    HTTP 无法注册 URL http://+:8000/。进程不具有此命名空间的访问权限
    使用QuartZ.net来做定时计划任务 ; 值不能为 null。 参数名: assemblyString
    cz.msebera.android.httpclient.conn.ConnectTimeoutException: Connect to /192.168.23.1:8080 timed out(Android访问后台一直说链接超时)
    Java的位运算符——&0xFF的运算与讲解
    android+myeclipse+mysql自定义控件下拉框的数据绑定
  • 原文地址:https://www.cnblogs.com/scue/p/3402366.html
Copyright © 2020-2023  润新知