5. gSoap2.x版與gSOAP 1.x版的不同
假如你是從1.x版升級到2.x版,請注重下面的內容。
gSOAP2.0及之后的版本是在1.x版基礎上重寫的。gSOAP2.0之后的版本是線程安全的,但之前版本不是。gSOAP2.x版本中的主要文件已經重新命名,以便與1.x版區分。
gSOAP 1.X gSOAP 2.X
soapcpp soapcpp2
soapcpp.exe soapcpp2.exe
stdsoap.h stdsoap2.h
stdsoap.c stdsoap2.c
stdsoap.cpp stdsoap2.cpp
從1.x版升級到2.x版并不需要進行大量的代碼重寫工作。所有2.x版相關的函數都定義在stdsoap2.c[pp]文件中,這個文件是由gSOAP編譯器自動生成的。所以,用1.x版開發的服務端或客戶端代碼需要進行修改以適應2.x版中函數的變化:在2.x版中,所有的gSOAP函數都增加了一個參數用來保存一個gSOAP運行環境實例。這個參數包括了文件描述,表,緩沖,標志位等,它在所有gSOAP函數中都是第一個參數。
gSOAP運行環境實例是一個strUCt soap類型的變量。當客戶端程序訪問遠程方法前或當服務端程序能夠接收一個請求前,必須先將這個運行環境變量初始化。在2.x版中新增了3個函數來負責這些事情:
函數 解釋
soap_init(struct soap *soap) 初始化環境變量(只需執行一次)
struct soap *soap_new() 定義并初始化環境變量并返回一個該變量的指針
struct soap *soap_copy(struct soap *soap) 定義一個環境變量并從已有的環境變量中拷貝環境信息
環境變量定義好后就可以重復使用而不必再次初始化了。只有當線程獨占訪問時,我們才需要一個新的環境變量。例如,下面的代碼分配了一個用于多個遠程方法的環境變量:
int main()
{
struct soap soap;
...
soap_init(&soap); // 初始化環境變量
...
soap_call_ns__method1(&soap, ...); // 調用一個遠程方法
...
soap_call_ns__method2(&soap, ...); // 調用另一個遠程方法
...
soap_end(&soap); // 清除環境變量
...
}
我們也可以像下面這樣定義環境變量:
int main()
{
struct soap *soap;
...
soap = soap_new(); // 定義并初始化環境變量
if (!soap) // 假如不能定義,退出
...
soap_call_ns__method1(soap, ...); // 調用遠程函數
...
soap_call_ns__method2(soap, ...); // 調用另一個遠程函數
...
soap_end(soap); // 清除環境變量
...
free(soap); // 釋放環境變量空間
}
服務端代碼在調用soap_serve函數前,需要定義相關環境變量:
int main()
{
struct soap soap;
soap_init(&soap);
soap_serve(&soap);
}
或者像下面這樣:
int main()
{
soap_serve(soap_new());
}
soap_serve函數用來處理一個或多個(當答應HTTP keep-alive時,參見18.11節中的SOAP_IO_KEEPALIVE標志)請求。
一個web服務可以用多線程技術來處理請求:
int main()
{
struct soap soap1, soap2;
pthread_t tid;
...
soap_init(&soap1);
if (soap_bind(&soap1, host, port, backlog) < 0) exit(1);
if (soap_accept(&soap1) < 0) exit(1);
pthread_create(&tid, NULL, (void*(*)(void*))soap_serve, (void*)&soap1);
...
soap_init(&soap2);
soap_call_ns__method(&soap2, ...); // 調用遠程方法
...
soap_end(&soap2);
...
pthread_join(tid, NULL); // 等待線程結束
soap_end(&soap1); // 釋放環境變量
}
新聞熱點
疑難解答