C++builder6中用IdHTTPServer实现一个简单的http server

最近需要用c++写个windows的程序, 程序里面要做个http server的程序,若是从头开发将非常麻烦, 仔细查看文档, 发现c++ builder的一些控件包装好了,直接使用,真的很便利。

关于bcb的安装大家到网络搜索吧, 我整理采用bcb6做开发, 操作系统采用windows7 64位系统。

一.打开bcb6的程序创建项目

1. 程序打开后默认创建了一个项目, 保存这个项目到一个单独的目录中, 做为项目的目录(bcb6项目管理部区分目录, 我们只能自己把每个项目单独存储到不同的项目目录中了)

在项目的默认form表单中放置一个memo控件

2. bcb的控件标签上 选择右侧的按钮, 一直点击到最后, 会出现indy servers控件的标签,在控件的标签中 再次点击右侧的按钮, 选择后面的控件, 最后选择 IdHTTPServer标签, 然后在form中单击控件

3. 运行这个空的项目, 检查项目是否有编译或者链接错误, 若是没有可以显示正常的界面

二.IdHTTPServer设置服务器控件

如下图, 在c++builder的项目的 form上面选中IdHTTPServer控件, 然后在熟悉视图中, 设置Acitve属性为true, 这样程序在运行后, 会让这个控件立即工作, 否则需要手动通过设置属性的方法,来工作。

然后设置默认端口为8000, 这样我们可以通过这个端口来访问我们的程序

三.设置IdHTTPServer空间的事件

如下图, 选中IdHTTPServer控件, 然后在属性视图中选择事件(Events)标签, 然后双击OnCommandGet事件, 进入相关事件响应函数中, 然后编写相关响应函数

四.编写事件响应函数

代码如下, 代码含义请参考注释,另外会提供源代码

void __fastcall TForm1::IdHTTPServer1CommandGet(TIdPeerThread *AThread,

      TIdHTTPRequestInfo *RequestInfo, TIdHTTPResponseInfo *ResponseInfo)

{

        // 获取http请求的命令名称, 例如是get请求, 或者post请求等

        AnsiString cmd = RequestInfo->Command;

        // 将获取的命令名称填写到备注栏中

        this->Memo1->Lines->Add("cmd\t" + cmd);

        // 获取参数列表里面的数据

        TStrings* paras = RequestInfo->Params;

        if(NULL != paras)

        {

                // 将参数的个数填写到memo中用来填写参数个数

                this->Memo1->Lines->Add("count\t" + paras->Count);

                // 循环遍历每个参数

                for(int i = 0; i < paras->Count; i++){

                        // 将每个参数的名称和相关值, 添加到memo控件中

                        this->Memo1->Lines->Add("name\t" + paras->Names[i] + "\tvalue:" + paras->Values[paras->Names[i]] );

                }

        }

        // 将未解析的数据获取到添加到memo

        this->Memo1->Lines->Add("UnparsedParams\t" +  RequestInfo->UnparsedParams );

        // 将请求的文档参数显示到页面中

        this->Memo1->Lines->Add("Document\t" +  RequestInfo->Document );

        // 写一个响应值给请求, 这个值会显示在浏览器中

        ResponseInfo->ContentText = "ok";

}

五.在浏览器里面访问这个服务器

1. 启动这个bcb项目, 然后在浏览器里面输入下面地址

http://localhost:8000/aa/?a=1

2. 观察浏览器响应

3. 观察应用程序的memo里面的内容

源代码:demo3

发表评论