使用 acl 生成嚮導快速建立服務器程序

      在之前有關使用 acl 的技術文章(如:使用 acl::master_threads 類編寫多進程多線程服務器程序 ,用 acl::master_aio 類編寫高併發非阻塞服務器程序使用 acl::master_proc 類編寫多進程服務器程序)中,對如何使用 acl 服務器框架類編寫服務器應用程序作了較爲詳細的描述,但手工輸入這些代碼畢竟是比較煩人的,在 acl 的 app/ 目錄下有一個嚮導程序:wizard,能夠幫助開發者快速生成服務器框架模板,開發者只需在相關位置添加業務邏輯代碼便可。下面是使用 wizard 嚮導程序的簡要過程:服務器

      首先在 acl 的根目錄下編譯全部的 acl 的基礎庫:make all,而後進入 app/wizard 目錄生成 wizard 程序:make,運行 ./wizard,出現以下界面:多線程

[zsx@localhost wizard]$ ./wizard 
select one below:
m: master_service; d: db; h: http; q: exit
# 上面過程提示用戶生成哪一種應用的程序,咱們此處是編寫服務器,因此選擇:m
>m

# 接着 wizard 提示咱們輸入應用程序名稱,此處能夠寫:echo_server
please input your program name: echo_server

# 而後 wizard 提示選擇何種服務器框架模板,此處選擇 t 表示使用多進程多線程服務器模板
# 各個參數類型說明以下:
# t:多進程多線程服務器模板
# p:多進程服務器模板
# a:多進程非阻塞服務器模板
# g:觸發器服務器模板
choose master_service type:
t: for master_threads; p: for master_proc; a: for master_aio; g: for master_trigger; s: skip choose
>t
create echo_server/Makefile ok.
create echo_server/echo_server.sln ok.
create echo_server/echo_server.vcproj ok.
create echo_server/Makefile.in ok
create echo_server/stdafx.h ok
create echo_server/stdafx.cpp ok
create common_files ok!
create echo_server/echo_server.cf ok.
create echo_server/Makefile.in ok
create echo_server/main.cpp ok
create echo_server/master_service.h ok
create echo_server/master_service.cpp ok
create master_threads ok!
------------------------------------------------------------------------------
select one below:
m: master_service; d: db; h: http; q: exit
>q
Bye!

 

      OK,輸入幾個字母,按幾下回車,一個相對完整的服務器程序便生成了。從上面的生成過程不難看出 wizard 嚮導程序不只生成了源文件,並且生成了工程文件以及服務器配置文件。併發

      進入 echo_server 目錄,打開自動生成的 master_service.cpp 文件,修改 master_service::thread_on_read 函數內容以下:app

 

bool master_service::thread_on_read(acl::socket_stream* conn)
{
        acl::string buf;
        
        // 從客戶端鏈接流中讀取一行數據,讀操做參見:acl_cpp/stream/istream.hpp
        if (client->gets(buf, false) == false)
        {
                printf("gets from client error, closed it!\r\n");

                // 返回 false 通知服務器框架將該客戶端鏈接關閉
                return false;
        }
        
        // 將從客戶端鏈接流中讀到數據回寫,寫操做參見:acl_cpp/stream/ostream.hpp
        if (client->write(buf) == -1)
        {
                // 返回 false 通知服務器框架將該客戶端鏈接關閉
                printf("write to client error, closed it!\r\n");
                return false;
        }

        // 返回 true 通知服務器框架繼續監聽該客戶端鏈接的下一個請求過程
        return true;
}

      同時修改 master_service::thread_on_accept 函數,內容以下:框架

bool master_service::thread_on_accept(acl::socket_stream* conn)
{
        // 設置客戶端鏈接讀寫超時時間(秒)
        conn->set_rw_timeout(10);

        // 向客戶端發送歡迎信息
        if (conn->format("+OK Welcome!\r\n") == -1)
        {
                printf("write to client error, close it!\r\n");
                // 返回 false 通知服務器框架關閉客戶端鏈接
                return false;
        }

        // 返回 true 通知框架監控該客戶端流的可讀狀態
        return true;
}

  

     一個很是簡單的 echo 服務器程序完成,編譯之(make),而後先以命令行方式進行測試:./echo_server alone 該服務器程序提示以下信息:listen on: 127.0.0.1:8888,意思是它如今開始監聽本機迴路地址的 8888 端口。能夠手工經過 telnet 命令測試它:      dom

[zsx@localhost ~]$ telnet 127.0.0.1 8888
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Welcome!
hello world!
hello world!

 

     固然,正式的生產環境下須要將 echo_server 程序放在 acl_master 服務器框架下運行,部署方式參見:acl服務器模塊的部署--示例 ,acl 服務器模塊的部署 。socket

 

參考:svn

     acl 庫下載:https://sourceforge.net/projects/acl/函數

     svn: svn://svn.code.sf.net/p/acl/code/高併發

     QQ 羣:242722074

相關文章
相關標籤/搜索