zoukankan      html  css  js  c++  java
  • 使用gSoap做一个简单的CS系统

    首先介绍一下gSoap,这是一个非常厉害的网络库,封装程度非常高而且跨平台。

    支持SSL链接,数据格式为XML。

    介绍地址:

    http://sourceforge.net/projects/gsoap2/

    近段时间是有项目需求,所以接触到了这个库。

    自己摸索了一下,发现用这个库开发真的是非常方便。

    所以,强烈推荐各位使用gSoap开发。

    使用gSoap的大致步骤是:

    1.下载gSoap库

    2.制定自己需要的函数

    3.使用soapcpp2导出需要的源文件

    4.添加这些源文件和库中的2个文件到工程

    5.简单的封装

    6.使用

    ~~~~~正文分割线~~~~~

    1.下载gSoap库

        可以到上面给出的介绍地址中下载。

    2.制定自己需要的函数

        更具具体需求,写出接口函数。

        要求:

            1.函数返回值类型是int;

            2.函数的最后一个参数,用于服务器返回数据给客户端,需要是一个指针或者引用。

            3.其他参数可自定义,用于客户端传数据给服务器。

        我的头文件的内容是

    [cpp] view plaincopy
     
    1. #ifndef __gSoapApi_h__  
    2. #define __gSoapApi_h__  
    3.   
    4. int dataStream(std::string name, double data, int &returnFlag);  
    5.   
    6. #endif//__gSoapApi_h__  

    3.使用soapcpp2导出需要的源文件

        在下载的源码包的 gsoap2-8/gsoap/bin/macosx 这个目录下,可以找到我们需要的soapcpp2工具。

        使用方法(在我的电脑上,具体路径请根据实际情况修改):

        1.切换到刚刚写好的头文件的目录

             /Users/Jason/Desktop/gSoapFoundation

        2.使用soapcpp2工具

            /Users/Jason/Downloads/gsoap-2.8/gsoap/bin/macosx/soapcpp2 myApi.h

        然后就可以看到在目录下生成了以下8个文件   

        soap.nsmap:一定要用一个.cpp文件include,不然编译报错(我电脑上是这样的)

        soapC.cpp:服务器和客户端都需要

        soapClient.cpp:客户端需要

        soapClientLib.cpp:可以不用

        soapH.h:一个头文件

        soapServer.cpp:服务器需要

        soapServerLib.cpp:可以不用

        soapStub.h:一个头文件

    4.添加这些源文件和库中的2个文件到工程

        注:stdsoap2.h 和 stdsoap2.cpp 都可以在源码包的 gsoap-2.8/gsoap 目录下找到。

        对于客户端:

            soapH.h、soapStub.h、soapClient.cpp、soapC.cpp、stdsoap2.cpp、soap.nsmap

        对于服务器:

            soapH.h、soapStub.h、soapServer.cpp、soapC.cpp、stdsoap2.cpp、soap.nsmap

        对于我的客户端项目的pro文件,内容是:

    [cpp] view plaincopy
     
    1. #-------------------------------------------------  
    2. #  
    3. # Project created by QtCreator 2015-08-14T15:22:03  
    4. #  
    5. #-------------------------------------------------  
    6.   
    7. QT       += core gui  
    8.   
    9. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  
    10.   
    11. TARGET = gSoapClient  
    12. TEMPLATE = app  
    13.   
    14.   
    15. SOURCES += main.cpp   
    16.     ../gSoapFoundation/soapClient.cpp   
    17.     ../gSoapFoundation/stdsoap2.cpp   
    18.     ../gSoapFoundation/soapC.cpp   
    19.     client.cpp  
    20.   
    21. HEADERS  +=   
    22.     client.h  

        对于我的服务器项目的pro文件,内容是:

    [cpp] view plaincopy
     
    1. #-------------------------------------------------  
    2. #  
    3. # Project created by QtCreator 2015-08-14T15:22:37  
    4. #  
    5. #-------------------------------------------------  
    6.   
    7. QT       += core gui  
    8.   
    9. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  
    10.   
    11. TARGET = gSoapServer  
    12. TEMPLATE = app  
    13.   
    14.   
    15. SOURCES += main.cpp   
    16.     ../gSoapFoundation/soapServer.cpp   
    17.     ../gSoapFoundation/stdsoap2.cpp   
    18.     server.cpp   
    19.     ../gSoapFoundation/soapC.cpp  
    20.   
    21. HEADERS  +=   
    22.     server.h  

    5.简单的封装

        在客户端,发送数据的借口,大概是这样的:

    [cpp] view plaincopy
     
    1. bool sendDatStream(const char *server, std::string name, double data, int &returnFlag)  
    2. {  
    3.     soap add_soap;  
    4.     soap_init(&add_soap);  
    5.   
    6.     soap_call_dataStream(&add_soap, server, "", name, data, returnFlag);  
    7.   
    8.     if(add_soap.error)  
    9.     {  
    10.         qDebug("soap error:%d,%s,%s", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );  
    11.         soap_end(&add_soap);  
    12.         return false;  
    13.     }  
    14.   
    15.     soap_end(&add_soap);  
    16.     return true;  
    17. }  

        在服务器,建立一个服务器和处理客户端发来数据的借口,大概是这样的:

    [cpp] view plaincopy
     
    1. void startServer(const char *address, int port)  
    2. {  
    3.     soap recieveSoap;  
    4.   
    5.     soap_init(&recieveSoap);  
    6.     qDebug() << "Soap bind return:" << soap_bind(&recieveSoap, address, port, 100);  
    7.   
    8.     while(true)  
    9.     {  
    10.         int s = soap_accept(&recieveSoap);  
    11.         if (s < 0)  
    12.         {  
    13.             soap_print_fault(&recieveSoap, stderr);  
    14.             qDebug() << "error";  
    15.             exit(-1);  
    16.         }  
    17.         qDebug() << "Socket connection successful: slave socket =" << s;  
    18.   
    19.         soap_serve(&recieveSoap);  
    20.         soap_end(&recieveSoap);  
    21.     }  
    22. }  
    23.   
    24. int dataStream(soap *, std::string name, double data, int &returnFlag)  
    25. {  
    26.     qDebug() << "dataStream" << name.c_str() << data;  
    27.     returnFlag = 123456;  
    28.     return 0;  
    29. }  

    6.使用

        客户端:

    [cpp] view plaincopy
     
    1. int returnFlag = 0;  
    2. qDebug() << sendDatStream("127.0.0.1:23410", "key", 3.1415, returnFlag);  
    3. qDebug() << returnFlag;  

        服务器:

    [cpp] view plaincopy
     
    1. startServer("127.0.0.1", 23410);  

    我也写了一个示例,可以到这里下载

    http://download.csdn.net/detail/wsj18808050/9012831

    http://blog.csdn.net/wsj18808050/article/details/47706715

  • 相关阅读:
    C# 迭代器.NET实现—IEnumerable和IEnumerator
    Excel、CSV文件处理
    C# 读写ini文件
    SCARA——OpenGL入门学习五六(三维变换、动画)
    GDI与OpenGL与DirectX之间的区别
    SCARA——OpenGL入门学习四(颜色)
    SCARA——OpenGL入门学习三
    SQLite数据库表是否存在
    数据库SQL语句单引号、双引号的用法
    C# 委托与事件
  • 原文地址:https://www.cnblogs.com/findumars/p/5034590.html
Copyright © 2011-2022 走看看