zoukankan      html  css  js  c++  java
  • 一个gSOAP web服务可以用多线程技术来处理请求

    gsoap中文文档(5.gSoap2.x版与gSOAP 1.x版的不同)

    5. gSoap2.x版与gSOAP 1.x版的不同
     如果你是从1.x版升级到2.x版,请注意下面的内容。
     gSOAP2.0及之后的版本是在1.x版基础上重写的。gSOAP2.0之后的版本是线程安全的,但之前版本不是。gSOAP2.x版本中的主要文件已经重新命名,以便与1.x版区分。

    gSOAP 1.X  gSOAP 2.X 
    soapcpp  soapcpp2 
    soapcpp.exe  soapcpp2.exe 
    stdsoap.h  stdsoap2.h 
    stdsoap.c  stdsoap2.c 
    stdsoap.cpp  stdsoap2.cpp 
     
     从1.x版升级到2.x版并不需要进行大量的代码重写工作。所有2.x版相关的函数都定义在stdsoap2.c[pp]文件中,这个文件是由gSOAP编译器自动生成的。所以,用1.x版开发的服务端或客户端代码需要进行修改以适应2.x版中函数的变化:在2.x版中,所有的gSOAP函数都增加了一个参数用来保存一个gSOAP运行环境实例。这个参数包括了文件描述,表,缓冲,标志位等,它在所有gSOAP函数中都是第一个参数。
     gSOAP运行环境实例是一个struct soap类型的变量。当客户端程序访问远程方法前或当服务端程序能够接收一个请求前,必须先将这个运行环境变量初始化。在2.x版中新增了3个函数来负责这些事情:
     函数                        解释
     soap_init(struct soap *soap)         初始化环境变量(只需执行一次)
     struct soap *soap_new()            定义并初始化环境变量并返回一个该变量的指针
     struct soap *soap_copy(struct soap *soap)   定义一个环境变量并从已有的环境变量中拷贝环境信息
     
      环境变量定义好后就可以重复使用而不必再次初始化了。只有当线程独占访问时,我们才需要一个新的环境变量。例如,下面的代码分配了一个用于多个远程方法的环境变量:
     int main()
    {
       struct soap soap;
       ...
       soap_init(&soap); // 初始化环境变量
       ...
       soap_call_ns__method1(&soap, ...); // 调用一个远程方法
       ...
       soap_call_ns__method2(&soap, ...); // 调用另一个远程方法
       ...
       soap_end(&soap); // 清除环境变量
       ...
    }
     我们也可以像下面这样定义环境变量:
     int main()
    {
       struct soap *soap;
       ...
       soap = soap_new(); // 定义并初始化环境变量
       if (!soap) // 如果不能定义,退出
       ...
       soap_call_ns__method1(soap, ...); // 调用远程函数
       ...
       soap_call_ns__method2(soap, ...); // 调用另一个远程函数
       ...
       soap_end(soap); // 清除环境变量
       ...
       free(soap); // 释放环境变量空间
    }
     
     服务端代码在调用soap_serve函数前,需要定义相关环境变量:

    int main()
    {
       struct soap soap;
       soap_init(&soap);
       soap_serve(&soap);

     或者像下面这样:

    int main()
    {
       soap_serve(soap_new());

     soap_serve函数用来处理一个或多个(当允许HTTP keep-alive时,参见18.11节中的SOAP_IO_KEEPALIVE标志)请求。
     一个web服务可以用多线程技术来处理请求:
    int main()
    {
       struct soap soap1, soap2;
       pthread_t tid;
       ...
       soap_init(&soap1);
       if (soap_bind(&soap1, host, port, backlog) < 0) exit(1);
       if (soap_accept(&soap1) < 0) exit(1);
       pthread_create(&tid, NULL, (void*(*)(void*))soap_serve, (void*)&soap1);
       ...
       soap_init(&soap2);
       soap_call_ns__method(&soap2, ...); // 调用远程方法
       ...
       soap_end(&soap2);
       ...
       pthread_join(tid, NULL); // 等待线程结束
       soap_end(&soap1); // 释放环境变量

     在上面的例子中,需要两个环境变量信息。而在1.x版本中,由于静态分配环境变量,多线程技术是不被允许的(只有一个线程可以用这个环境变量调用远程方法或处理请求信息)。
     8.2.4节将给出一个具体的多线程服务实例,它为每个SOAP请求分配一个独立线程进行处理。

  • 相关阅读:
    委托&指针函数&回调函数
    Unity animation笔记1
    hadoop源码编译
    protocbuf的安装
    学习hadoop不错的一些文章
    moven的安装
    在Linux上安装与配置Hadoop
    linux tar命令详解
    How to contribute to hadoop common
    Ubuntu下SVN的安装
  • 原文地址:https://www.cnblogs.com/cy163/p/1556775.html
Copyright © 2011-2022 走看看