Qt:使用gSoap做一个简单的CS系统

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


首先介绍一下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.其他参数可自定义,用于客户端传数据给服务器。


    我的头文件的内容是

  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文件,内容是:

  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文件,内容是:

  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.简单的封装

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

  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. }  


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

  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.使用

    客户端:

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


    服务器:

  1. startServer("127.0.0.1", 23410);  

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

http://download.csdn.net/detail/wsj18808050/9012831
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值