您的位置:首页 > 编程语言 > Qt开发

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

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

我的头文件的内容是

#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);


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

http://download.csdn.net/detail/wsj18808050/9012831
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: