java 和c++通信的方式之一webservice
用gsoap编译头文件,如果要多线程一定要在转线程的时候用对象的拷贝构造函数重新构造一个对象,不然会出错
头文件:
//gsoap ns service name: Model
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service namespace: http://Model.local
//gsoap ns service location: http://127.0.0.1:10087/service.asmx
//gsoap ns schema namespace: urn:Model
//创建一个文件
int ns__CreateAFile(std::string* responseData);
自动生成代码的bat:
soapcpp2 -S -i -pmodel -x model.h
pause;
--------------------------------------------------------
调用service的工程
#ifndef MODEL_SERVER_H
#define MODEL_SERVER_H
#include "./soap/modelModelService.h"
#include "iostream"
using namespace std;
class ServerFileCreate:public ModelService
{
public:
ServerFileCreate();
~ServerFileCreate();
virtual int CreateAFile(std::string *responseData) ;
private:
};
#endif
--------
#include "modelserver.h"
ServerFileCreate::ServerFileCreate()
{
}
ServerFileCreate::~ServerFileCreate()
{
}
int ServerFileCreate::CreateAFile(std::string *responseData)
{
cout<<"hello"<<endl;
*responseData = " is running!";
return SOAP_OK;
}
---------------------------------------------------------------调度代码-------------
#ifndef SERVER_MANGER_H
#define SERVER_MANGER_H
#include "modelserver.h"
#include <Windows.h>
class ServerManger
{
public:
ServerManger();
~ServerManger();
int webservice_single_thread();
int callser();
//DWORD WINAPI Thread1(LPVOID lpParmeter)
static unsigned int __stdcall ExcuteServe(void * lpParmeter);
protected:
private:
ServerFileCreate m_serverFileCreate;
};
#endif
--------------
#include "servicemanger.h"
#include <process.h>
ServerManger::ServerManger()
{
}
ServerManger::~ServerManger()
{
}
unsigned ServerManger::ExcuteServe(void * lpParmeter)
{
ServerManger * AServerManger = (ServerManger*)lpParmeter;
AServerManger->callser();
//cout<<"hello"<<endl;
return 0;
}
int ServerManger::callser()
{
ServerFileCreate * pserv = new ServerFileCreate(m_serverFileCreate);
if (-1==pserv->serve( ))
{
return -1;
}
return 0;
}
int ServerManger::webservice_single_thread()
{
cout<<"begin bind"<<endl;
if (-1==m_serverFileCreate.bind(NULL, 10087, 5))
{
return -1;
}
while (1)
{
cout<<"begin accept"<<endl;
if (-1==m_serverFileCreate.accept( ))
{
return -1;
}
///创建一个线程执行
{
//HANDLE hand = CreateThread(0, 0, ThreadFunc, &a, 0, &id);
//等待线程完成以后再走后面的程序,INFINITE就是无限等待。
//WaitForSingleobject(hand, INFINITE);
//m_threadhanlde = (HANDLE)_beginthreadex(NULL,0,ABridge,this,0,&threadid);
HANDLE threadhanlde= (HANDLE)_beginthreadex(NULL,0,ExcuteServe,this,0,NULL);
if (threadhanlde == NULL)
{
//创建线程失败
return -1;
}
}
// if (-1==m_serverFileCreate.serve( ))
// {
// return -1;
// }
}
return 0;
}
---main.cpp
#include "servicemanger.h"
int main()
{
ServerManger serverManger;
serverManger.webservice_single_thread();
return 0;
}
-----------------------------------
C++ 写好webservice服务器供 JAVA调用,这个时候调不通。报错
#define SOAP_GET_METHOD 15
而你用soupui来调用,却可以调的通,这时候有可能是java版本和C用的Gsoup版本不通导致,C的版本很老,JAVa版本教新。
比如java是 axis高版本或者 cxf,可以换成教老的axis1.4 也许能解决问题
------------------------------------------------------------------------------------------------