在之前有關使用 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