一个简单的 C++ 嵌入 Web 服务器(2)

// Initialize web server.
http::server::cWebem theServer(
    "0.0.0.0",        // address
              "1570",          // port
          ".\\");          // document root

第四步:用webem注册应用方法:

cHello hello;
 
// register application method
// Whenever server sees <!--#webem hello -->
// call cHello::DisplayHTML() and include the HTML returned
 
theServer.RegisterIncludeCode( "hello",
  boost::bind(
  &cHello::DisplayHTML,  // member function
  &hello ) );    // instance of class

第五步:最后,你已经准备好了启动服务。

// run the server
theServer.Run();

一个正式的Hello

让我们来创建一个更儒雅的程序,可通过姓名(如CodeProject,Canadian)来定位网络。

第一步:新建站点:

What is your name, please?
<form action=name.webem>
<input name=yourname /><input value="Enter" type=submit />
</form>
 
The Webem Embedded Web server says: <!--#webem hello -->

该表单提供一个文本域,可以使用户输入姓名。另外还有一个提交按钮将姓名提交给服务器。表单属性“action=name.webem”确保webem服务器会调用应用通过“name”注册的方法来处理输入。

第二步:创建应用类:

/// An application class which says hello to the identified user
 
class cHelloForm
{
string UserName;
http::server::cWebem& myWebem;
 
public:
  cHelloForm( http::server::cWebem& webem ) :
    myWebem( webem )
  {
    myWebem.RegisterIncludeCode( "hello",
    boost::bind(
    &cHelloForm::DisplayHTML,  // member function
    this ) );      // instance of class
    myWebem.RegisterActionCode( "name",
    boost::bind(
    &cHelloForm::Action,  // member function
    this ) );      // instance of class
  }
  char * DisplayHTML()
  {
    static char buf[1000];
    if( UserName.length() )
    sprintf_s( buf, 999,
      "Hello, %s", UserName.c_str() );
    else
      buf[0] = &apos;\0&apos;;
    return buf;
  }
  char * Action()
  {
    UserName = myWebem.FindValue("yourname");
    return "/index.html";
  }
};

这个类存储了对webem服务器的引用. 它允许在其构建时维护对其自身方法的注册, 并调用cWebem类的FindValue()来提取输入表单域中的值.

这个类需要注册两个方法,一个在表单提交时保存输入的用户名,一个用来在页面被组合起来发送给浏览器时展示被存储的用户名称.

动作方法必须返回要在提交按钮点击响应中展示的web页面.

注意所有的动作方法都是有Webem在包含方法之前调用的,所以web页面总是会展示更新了的数据.

第三步:构建webem,构建应用类并启动服务器:

// Initialize web server
http::server::cWebem theServer(
  "0.0.0.0",        // address
  "1570",          // port
  ".\\");          // document root
 
// Initialize application code
cHelloForm hello( theServer );
 
// run the server
theServer.Run();

你可能需要在其他线程中启动服务器,这样你应用能够继续在实验室装置中记录日志数据。为了做到这一点,更改对server::run的调用:

boost::thread* pThread = new boost::thread(
boost::bind(
&http::server::server::run,    // member function
&theServer ) );      // instance of class

Webem 控件

Webem控件是以标准方式监视显示和操作应用数据的细节的类,所以应用程序开发者不需要关注生成HTML文本的所有细节。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e101741bcb33afe099ee41bf3cb83c28.html