我首先动手写的是服务端,关于服务端:
在VC里我建了一个login的项目,在这个项目里最初只包含三个文件,然后我自建了一个名为ifun.h的头文件,在这个文件里我自己编写了声明了四个函数头(int ns__Login(char* strUserID, char* strPwd, wchar_t*& iLoginInfo);int ns__Add_ID(char* strUserID, char* strPwd,wchar_t*& iLoginInfo);int ns__Delete_ID(char* strUserID, wchar_t*& iLoginInfo);int ns__Modify_ID(char* strUserID, char* strPwd, wchar_t*& iLoginInfo);),这四个函数就是我设计的要向客户端提供的服务函数,分别提供四种功能,然后我利用gsoap工具通过这个文件自动生成了一些与soap服务有关的文件,当然在这些文件里对于有些文件我做了一些修改(例如,在soapserver.h文件里我加入了int is_wsdl();int ser_send_wsdl();这两个函数,前一个用于判断是否请求wsdl,后一个用于发送wsdl文件,在soapserver.cpp文件里我借鉴着编写了上面声明的那四个函数的函数体),之后我又借鉴着陆续添加了一些文件到我的工程里面,这些文件有头文件:CharConvert.h、Database.h、MailSender.h、markup.h、publicFunction.h、stdsoap2.h以及源文件:Database.cpp、markup.cpp、publicFunction.cpp、stdsoap2.cpp。在这些文件里Database.h和Database.cpp用于提供数据库服务,最后我向stdafx.h文件里加入了一些宏定义、条件编译以及设计了主文件login.cpp,文件代码如下:
// login1.cpp : 定义控制台应用程序的入口点。
//
#include <vector>
#include "stdafx.h"
#include "Database.h"
#include "soapService.h"
#include "ns.nsmap"
#include "Markup.h"
#include "PublicFunction.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
#include "MailSender.h"
#define PER_MINUTE (60000)
using namespace std;
int http_get(struct soap * soap);
CDataBase g_DataBase;
int _tmain(int argc, _TCHAR* argv[])
{
//连接数据库
if(!g_DataBase.OpenDatabase())
{
return 1;
}
Service calc;
calc.imode |= SOAP_C_UTFSTRING;
calc.omode |= SOAP_C_MBSTRING;
calc.fget = http_get;
if (!(argc < 2))
{
// serve as CGI application
calc.serve();
calc.destroy();
}
if (calc.run(9999))
{
calc.soap_stream_fault(std::cerr);
exit(-1);
}
return 0;
}
//能够远程读取wsdl文件
int http_get(struct soap * soap)
{
if (0 != strcmp(soap->path, "/ns.wsdl"))
{
return SOAP_GET_METHOD;
}
//读取硬盘wsdl文件
CString cstrWsdlName = CPublicFunction::GetWsdlName();
CString cstrWsdlPath = CPublicFunction::GetWsdlPath();
CString cstrWsdl = cstrWsdlPath + cstrWsdlName;
CMarkup xmlWsdl;
string strWsdl;
if(xmlWsdl.Load(cstrWsdl))
{
strWsdl = xmlWsdl.GetDoc();
cout << strWsdl.c_str() <<endl;
}
soap->http_content = "xml";
soap_response(soap, SOAP_FILE);
soap_send_raw(soap, strWsdl.c_str(), strWsdl.length());
soap_end_send(soap);
return SOAP_OK;
}
之后我便进行编译了,根据编译报错逐渐地向相应的文件中加入了一些文件包含,以及对于工程属性做了一些修改,之后便通过编译了,我的服务端便完成了。
最后我再来写我的客户端,对于客户端:
我在Flashbuilder里建了一个名为webserver的