精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
SOAP通常基于HTTP协议使用,也可以在其它协议环境里用。基于HTTP协议,相当于用XML格式来传递了些数据,有了这些数据就可以传递参数信息,这样进而实现了远程调用RPC。从我写成的代码层面来讲,一个函数语句调用了远程服务器上的功能,结果返回到函数参数里了。
gSOAP开源项目支持SOAP协议,比较常用;gSOAP提供了命令行软件支持自动生成客户端和服务器端代码框架,导入到自己项目里,再进行适当修改就可以使用。接上段话说的函数语句,生成的代码就是把函数参数展开,按XML处理,再结合通信协议,进行准备、发送、接收、分析和结果导入的一个过程。函数参数可以是结构体,也可以是单纯的字符串,如果觉得结构体麻烦,自己可以设置字符串格式负责解析。具体使用过程网上都有说明,这里不多说。
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的扩展如下:
1、多线程,多个线程接收客户端请求,扩大并发量。
2、返回字符串,内部数据协调读取。
3、白名单,防止DDOS攻击
4、微调向导生成的Java客户端代码
5、服务循环里状态判断Bug,避免极端情况下退出循环,跳出服务
6、结合plog对某些状态进行日志输出
如果需要这些技术,或者进行其它深度定制开发,欢迎联系锐英源,进行有偿合作。