首先介绍一下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