1. 程式人生 > >Qt:使用gSoap做一個簡單的CS系統

Qt:使用gSoap做一個簡單的CS系統

首先介紹一下gSoap,這是一個非常厲害的網路庫,封裝程度非常高而且跨平臺。

支援SSL連結,資料格式為XML。

介紹地址:

近段時間是有專案需求,所以接觸到了這個庫。

自己摸索了一下,發現用這個庫開發真的是非常方便。

所以,強烈推薦各位使用gSoap開發。

使用gSoap的大致步驟是:

1.下載gSoap庫

2.制定自己需要的函式

3.使用soapcpp2匯出需要的原始檔

4.新增這些原始檔和庫中的2個檔案到工程

5.簡單的封裝

6.使用

~~~~~正文分割線~~~~~

1.下載gSoap庫

    可以到上面給出的介紹地址中下載。

2.制定自己需要的函式

    更具具體需求,寫出介面函式。

    要求:

        1.函式返回值型別是int;

        2.函式的最後一個引數,用於伺服器返回資料給客戶端,需要是一個指標或者引用。

        3.其他引數可自定義,用於客戶端傳資料給伺服器。

    我的標頭檔案的內容是

#ifndef __gSoapApi_h__
#define __gSoapApi_h__

int dataStream(std::string name, double data, int &returnFlag);

#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檔案,內容是:

#-------------------------------------------------
#
# Project created by QtCreator 2015-08-14T15:22:03
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = gSoapClient
TEMPLATE = app


SOURCES += main.cpp \
    ../gSoapFoundation/soapClient.cpp \
    ../gSoapFoundation/stdsoap2.cpp \
    ../gSoapFoundation/soapC.cpp \
    client.cpp

HEADERS  += \
    client.h

    對於我的伺服器專案的pro檔案,內容是:

#-------------------------------------------------
#
# Project created by QtCreator 2015-08-14T15:22:37
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = gSoapServer
TEMPLATE = app


SOURCES += main.cpp \
    ../gSoapFoundation/soapServer.cpp \
    ../gSoapFoundation/stdsoap2.cpp \
    server.cpp \
    ../gSoapFoundation/soapC.cpp

HEADERS  += \
    server.h

5.簡單的封裝

    在客戶端,傳送資料的藉口,大概是這樣的:

bool sendDatStream(const char *server, std::string name, double data, int &returnFlag)
{
    soap add_soap;
    soap_init(&add_soap);

    soap_call_dataStream(&add_soap, server, "", name, data, returnFlag);

    if(add_soap.error)
    {
        qDebug("soap error:%d,%s,%s", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
        soap_end(&add_soap);
        return false;
    }

    soap_end(&add_soap);
    return true;
}


    在伺服器,建立一個伺服器和處理客戶端發來資料的藉口,大概是這樣的:

void startServer(const char *address, int port)
{
    soap recieveSoap;

    soap_init(&recieveSoap);
    qDebug() << "Soap bind return:" << soap_bind(&recieveSoap, address, port, 100);

    while(true)
    {
        int s = soap_accept(&recieveSoap);
        if (s < 0)
        {
            soap_print_fault(&recieveSoap, stderr);
            qDebug() << "error";
            exit(-1);
        }
        qDebug() << "Socket connection successful: slave socket =" << s;

        soap_serve(&recieveSoap);
        soap_end(&recieveSoap);
    }
}

int dataStream(soap *, std::string name, double data, int &returnFlag)
{
    qDebug() << "dataStream" << name.c_str() << data;
    returnFlag = 123456;
    return 0;
}


6.使用

    客戶端:

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


    伺服器:

    startServer("127.0.0.1", 23410);

我也寫了一個示例,可以到這裡下載