|
一、准备工作
1、编译器gcc
Linux(建议Ubuntu 14.04 32位版)下,最新版本需下载源代码自行编译,地址如下,
http://gcc.gnu.org/
Windows下,可以直接下载编译版本Mingw,下载地址如下,
http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/
Ubuntu下,如不需要最新版本,可用如下命令安装,
sudo apt-get install gcc g++
2、集成开发环境Code::Blocks
跨平台的开发环境,Windows下和Linux下都可使用,方便调试,下载地址如下,
http://www.codeblocks.org/downloads/26
Ubuntu下,可用如下命令安装,(在个人电脑上,需安装KDE等桌面环境,编译好网站程序后,只需将网站程序发布到服务器上)
sudo apt-get install codeblocks
3、网站平台Apache
下载地址,http://www.apache.org/
Ubuntu下,可用如下命令安装
sudo apt-get install apache2
4、支持C++的Apache模块knewcode
最新版本0.92a版,下载地址如下,
http://down.51cto.com/data/2096670
(在debug目录下,附带了适用Windows的Apache2.2.25版)
非常适用于最低配置的阿里云或腾讯云,预装32位的Ubuntu 14.04版的服务器。
二、构建Web网站
1、hello world的例子
(1)、页面hello_world.kc
代码如下,
(2)、动态库hello_world_cpp
hello_world.cpp代码如下,需要编译为hello_world_cpp.dll(Windows下)或hello_world_cpp.so(Linux下),放在网站根目录的“bin”子目录下,
#include
#include
using namespace std;
#include "common_define.h"
class IHelloWorld
{
public:
virtual const char* CALL_TYPE HelloWorld(const char*) = 0;
};
class CHelloWorld : public IHelloWorld
{
public:
virtual const char* CALL_TYPE HelloWorld(const char* s)
{
m_s = string("Hello ") + s;
cout 或%>】括起来的字符串为knewcode的脚本;
注释:脚本中用大括号括起来的为注释;
#note和#end-note关键字:用于注释掉HTML文本,如,文字,中间的“文字”将不会在最终的页面上显示;
a)、定义语句,包括变量定义,加载动态库定义,接口定义,包含页面定义等:
#void、#int、#double、#string、#bool、#interface:数据类型关键字,#void只能用于定义无返回值的函数,其余类型可用于定义变量和函数形参;
#true、#false:bool类型的常量值;
函数定义:如,“#void ShowInfo(#int, #interface);”,首先,定义返回值类型,无返回值定义为“#void”,接下来是函数名,最后是用小括号括起来的形参列表;
#load:加载动态库的语句,如,“#load $mod1 = "/bin/hello_world_cpp";”,可加载“bin”目录下的“hello_world_cpp”动态库;不必写扩展名,Windows下默认扩展名为“.dll”,Linux下默认扩展名为“.so”;
定义加载动态库后,要马上定义该动态库内包含的函数列表,函数名要与动态库中的函数名对应;
一个脚本括号内只能定义一个加载动态库,不能再包含其他的语法元素;
#interface:定义接口的语句,如,“#interface;”,尖括号内为接口的名称;
定义接口后,要马上定义该接口包含的所有函数列表;该函数列表与C++接口定义中的虚函数对应,并且是按顺序对应(不是按函数名对应);
一个脚本括号内只能定义一个接口,不能再包含其他的语法元素;
#include:包含其它页面的语句,如,“#include "/session/so_session.kc";”,将把其它页面的内容包含到当前位置;
一个脚本括号内如果包含了#include,就只能包含一组#include,不能再包含其他的语法元素;
b)、表达式:
运算符:()、+、-、*、/、\、&&、||、!、^、==、!=、=
函数调用:如,“$in.HelloWorld($name);”,首先是接口变量名(或加载动态库名),接下来是成员提取符(实心点),最后是用小括号括起来的实参列表;返回值可以赋值给变量,也可以打印到页面上;
c)、结构语句,每个脚本括号内只能有一条语句,并且以分号结束语句。
#print:打印到页面语句;
#exit:退出页面语句;
#if、#else-if、#else、#end-if:条件分支语句;
#while、#end-while、#break、#continue:循环语句;
d)、内部变量:
$$get["参数"]:链接串中get参数;
$$post["参数"]:页面post参数;
$$cookie["名称"]:页面cookie值;
$$user["名称"]:自定义内部变量。
三、构建Web Service服务器端
1、服务器端的例子
(1)、业务部分同hello_world_cpp例子,见“一、1、(2)”;
(2)、页面webservice.kc
代码如下,
2、服务器端的例子
代码如下,
using System;
using System.Configuration;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace webservice_client
{
// “iWebs”对应服务器端脚本的接口变量名
[System.Web.Services.WebServiceBindingAttribute(Name = "WebServiceBase", Namespace = "iWebs")]
public class WebServiceBase : System.Web.Services.Protocols.SoapHttpClientProtocol
{
// 客户端cookie
private static System.Net.CookieContainer g_cookies = new System.Net.CookieContainer();
// 构造
public WebServiceBase()
{
this.Url = ""http://127.0.0.1:8090/webservice.kc"";
this.CookieContainer = g_cookies;
this.Timeout = 3600 * 1000 * 8;
}
// 函数测试
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public string HelloWorld(string name)
{
return this.CallWebMethod("HelloWorld", new object[] {name}, "");
}
// 执行服务器端方法
protected T CallWebMethod(string methodName, object[] parameters, T DefaultValue)
{
try
{
object[] result = this.Invoke(methodName, parameters);
return (T)result[0];
}
catch (Exception)
{
// throw;
}
return DefaultValue;
}
}
}
|
|
|