锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / gSOAP、gSOAP开源和gSOAP定制开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

gSOAP、gSOAP开源和gSOAP定制开发


SOAP


SOAP通常基于HTTP协议使用,也可以在其它协议环境里用。基于HTTP协议,相当于用XML格式来传递了些数据,有了这些数据就可以传递参数信息,这样进而实现了远程调用RPC。从我写成的代码层面来讲,一个函数语句调用了远程服务器上的功能,结果返回到函数参数里了。


gSOAP

gSOAP开源项目支持SOAP协议,比较常用;gSOAP提供了命令行软件支持自动生成客户端和服务器端代码框架,导入到自己项目里,再进行适当修改就可以使用。接上段话说的函数语句,生成的代码就是把函数参数展开,按XML处理,再结合通信协议,进行准备、发送、接收、分析和结果导入的一个过程。函数参数可以是结构体,也可以是单纯的字符串,如果觉得结构体麻烦,自己可以设置字符串格式负责解析。具体使用过程网上都有说明,这里不多说。


gSOAP开源

gSOAP下载地址:http://sourceforge.net/projects/gsoap2。 下载后可以用工具生成代码,这里把锐英源的多线程gSOAP代码开源,供大家使用

下面是服务循环代码:

{
if (!soap_valid_socket(this->master) && !soap_valid_socket(this->bind(NULL, port, 100)))
return this->error;
HANDLE hThread[MAX_THR];
CSOAPItem si[MAX_THR];
int isiturn=0;
for(int i = 0; i <MAX_THR; i++)
{
DWORD threadId;
hThread[i]=::CreateThread(NULL, 1024*100, process_soap, (void*)&si[i], 0, &threadId);
Sleep(50);
}
SOAP_SOCKET s;
for (;!bServerClose;)
{
s=accept();
if (!soap_valid_socket(s))
{
if (this->errnum == 0) // timeout?
{
this->error = SOAP_OK;
this->destroy();
continue;
}
LOG_ERROR<<"valid socket break";
this->destroy();
continue;
}
si[isiturn++].enqueue(s);
if(isiturn>=MAX_THR) isiturn=0;
}
if(bServerClose) this->error=SOAP_OK;

for(int i=0;i<MAX_THR;i++)
{
WaitForSingleObject(hThread[i],INFINITE);
hThread[i]=NULL;
//delete soap_thr[i];
//soap_thr[i]=NULL;
}
return this->error;
}

下面是客户端连接请求处理线程代码:

DWORD WINAPI process_soap(LPVOID psp)//线程入口函数 
{
CSOAPItem * pItem = (CSOAPItem*)psp;
SOCKET sk;
double ts;
time_t odtNow,odtHeartLast;
time(&odtHeartLast);
Service ser(SOAP_XML_INDENT);
for(;;)
{
sk = pItem->dequeue();
if(sk==0)
{
if(bServerClose) break;
Sleep(5);
continue;
}
if (!soap_valid_socket(sk))
{
if(bServerClose) break;
Sleep(5);
continue;
}
try
{
ser.socket=sk;
ser.serve();
//ser.destroy();
ser.end();
// delete ser;
// ser=NULL;
}
catch (CMemoryException* e)
{

}
catch (CFileException* e)
{
}
catch (CException* e)
{
WCHAR wcerror[255];
e->GetErrorMessage(wcerror,255);
LOG_ERROR<<"通信线程异常,"<<wcerror;
pItem->enqueue(sk);
}
if(bServerClose) break;
}
//delete tsoap;
return NULL;
}

如果有细节问题不明白,请加QQ396806883详细咨询。

gSOAP定制开发

锐英源对gSOAP的扩展如下:

1、多线程,多个线程接收客户端请求,扩大并发量。

2、返回字符串,内部数据协调读取。

3、白名单,防止DDOS攻击

4、微调向导生成的Java客户端代码

5、服务循环里状态判断Bug,避免极端情况下退出循环,跳出服务

6、结合plog对某些状态进行日志输出

如果需要这些技术,或者进行其它深度定制开发,欢迎联系锐英源,进行有偿合作。

gSOAP开源
友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内