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);
我也寫了一個示例,可以到這裡下載