设为首页 收藏本站
查看: 1518|回复: 0

[经验分享] 使用Apache + knewcode,用传统C++构建Web网站

[复制链接]

尚未签到

发表于 2018-11-21 07:07:32 | 显示全部楼层 |阅读模式
  一、准备工作
  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;
        }
    }
}  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-637506-1-1.html 上篇帖子: CentOS6 编译安装LAMP(Apache 下篇帖子: APACHE服务实验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表